Python蓝桥杯ALGO-994 最大分解

题目描述

问题描述
  给出一个正整数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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值