寻找n以内的亲密数对 python

问题描述:

寻找n以内的亲密数对。
代码格式如下:
def fac(n):
    ...
    return  xxx

n = int(input())   # 此处输入由系统自动完成不需要自己输入,只要写这样一条语句即可

题目内容:
对于两个不同的整数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将A和B称为亲密数。自定义函数fac(x)计算x包括1但不包括本身的所有因子和并返回。从键盘输入整数n,调用fac()函数寻找n以内的亲密数并输出。注意每个亲密数对只输出一次,小的在前大的在后,例如220-284。
输入格式:
按提示用input()函数输入
输出格式:
按样例形式,可使用形如“print("{}-{}".format(参数1, 参数2))”输出语句进行亲密数对的输出
输入样例:
500
输出样例:
220-284

时间限制:1500ms内存限制:100000kb
 

# 计算给定数的所有因子
# 因子就是所有可以整除这个自然数的整数,不包括这个数自身。
def getAllFactor(n):

    list=[]
    if n==1:
        list.append(1)
    else:
        for i in range(1,int(n/2)+1):
            if n%i==0:
                list.append(i)
    return list

def fac(n):
    list=[]
    dict={}

    for i in range(1,n):
        dict["{0}".format(i)]=sum(getAllFactor(i))

    for a in range(1,n-1):
        for b in range(a+1,n):
            sumOflistA=dict["{0}".format(a)]
            sumOflistB=dict["{0}".format(b)]

            if(sumOflistA==b and sumOflistB==a):
                list.append("{0}-{1}".format(a,b))

    return print(list)

import time
start=time.time()

fac(500)

end=time.time()
print(end-start)

执行结果: 

['220-284']
0.08019304275512695

网页提交时,反馈执行时间超标,更改程序为:

# 计算给定数的所有因子
# 因子就是所有可以整除这个自然数的整数,不包括这个数自身。
def getAllFactor(n):

    list=[]
    if n==1:
        list.append(1)
    else:
        for i in range(1,int(n/2)+1):
            if n%i==0:
                list.append(i)
    return list

def fac(n):
    for a in range(1,n):
        b = sum(getAllFactor(a))
        if b>a and b<=n and sum(getAllFactor(b)) == a:
            print('{0}-{1}'.format(a,b))

import time
start=time.time()

fac(500)

end=time.time()
print(end-start)

执行结果: 

220-284
0.005019664764404297

速度提升了不少,终于提交成功

上一篇:[JXOI2018]排序问题


下一篇:[JXOI2018]游戏