看了一些提交记录,里面是默认知道完全数为:6/28/496/8128。如果不知道具体的完全数是多少,如何在有限的时间和运存大小下找到完全数?仅仅只用了一些小学数学常识,参考了一个博客指路:https://blog.csdn.net/qq_41807327/article/details/102983896
- 常规思路,复杂度很高
import sys for s in sys.stdin: m=int(s) num=[] for i in range(1,m): s=0 for k in range(1,i): if i%k==0: s=s+k if i==s: num.append(s) print(len(num))
执行结果: 运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。 用例通过率: 90.00% 运行时间: 2001ms 占用内存: 3360KB
2.大于这个数1/2的公因子是不存在的,第二次循环次数减少了一半
import sys for s in sys.stdin: m=int(s) num=[] for i in range(1,m): s=0 for k in range(1,int(i/2+1)): if i%k==0: s=s+k if i==s: num.append(s) print(len(num))
运行时间:995ms 占用内存:3372k
3.一对因子总会发布在这个数的根号两边,或者就是这平方根值。再次减少第二次循环的复杂度
import sys for s in sys.stdin: m=int(s) num=[] for i in range(2,m):#1不算 s=1#每个数都会有个因子是1 for k in range(2,int(pow(i,1/2)+1)):#不将1和本身写入因子中 #print(k) if i%k==0: #print("一") res=i/k if k==res:#为平方根 s=s+k #print("二",s) else: s=s+k+res #print("三",s) if i==s: num.append(s) print(len(num))
运行时间:73ms 占用内存:3416k
备注:牛客上编程输入,写input经常会出错,要写成:
import sys for s in sys.stdin: m=int(s)
也不知道为什么。。。。
另外最后一行print的位置