看了一些提交记录,里面是默认知道完全数为:6/28/496/8128。如果不知道具体的完全数是多少,如何在有限的时间和运存大小下找到完全数?仅仅只用了一些小学数学常识,参考了一个博客指路:https://blog.csdn.net/qq_41807327/article/details/102983896

  1. 常规思路,复杂度很高图片说明
    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的位置