题目描述
问题描述
给出一个正整数n,求一个和最大的序列a0,a1,a2,……,ap,满足n=a0>a1>a2>……>ap且ai+1是ai的约数,输出a1+a2+……+ap的最大值
输入格式
输入仅一行,包含一个正整数n
输出格式
一个正整数,表示最大的序列和,即a1+a2+……+ap的最大值
样例输入
10
样例输出
6
思路描述
贪心啊,每次都取局部最优解。。。。这是为数不多不参考大佬博客做出来的题目~~~~~··
这里的优化主要体现在求最大约数上,我不一定是最好的方式哦。。。纯自己想的思路,如果有大佬,请在评论区指导!!!!!
1.一个数的最最大约数,正常的思路从N到1依次遍历 找到第一个能整除的就是。。。
但是这种方式有个缺陷,如果是一个超大质数N 就要从1 遍历到N
因此,我们可以考虑求质数的范围。即sqrt(N)
但是从末尾开始遍历会增多遍历次数。比如 100 最大 的约数是50。 从100-50要遍历50次,,,但是如果从2开始遍历只要一次。。。。即我们只需要找100的最小约数,100除以这个最小约数就是最大约数了。。。。。。。。
代码如下
import math
def get_max_divisor(N):
tmp=math.ceil(math.sqrt(N))
for i in range(2,tmp+1):
if N%i==0:
return N//i
return 1
N=int(input())
tmp_d=N
res=0
while tmp_d>1:
tmp_d=get_max_divisor(tmp_d)
res+=tmp_d
N//=tmp_d
print(res)
1050

被折叠的 条评论
为什么被折叠?



