如何找到未知的完全数

iNOC产品部--完全数计算

http://www.nowcoder.com/questionTerminal/7299c12e6abb437c87ad3e712383ff84

看了一些提交记录,里面是默认知道完全数为: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的位置

全部评论
在Python中字符串是immutable对象,是不可变对象。所以string使用replace需要重新赋值,生成一个新的对象,之前没有重新引用,导致该变量 指向的是 以前的对象,实则已经发生变化,只是没有重新引用而已,所以要想打印出替换后的字符串需要重新赋值
1 回复 分享
发布于 2021-07-27 15:18
input报错是要加异常 while True: try: _n = int(input()) except: break
5 回复 分享
发布于 2020-09-07 22:03
hi 我看n的取值可以到500000,你的方法三在这个场景也会超时,请教下还有其他好的方法么
点赞 回复 分享
发布于 2021-05-27 20:37
为啥大于这个数1/2的公因子是不存在的呢?
点赞 回复 分享
发布于 2021-11-25 16:37

相关推荐

贪食滴🐶:你说熟悉扣篮的底层原理,有过隔扣职业球员的实战经验吗
点赞 评论 收藏
分享
52 11 评论
分享
牛客网
牛客企业服务