本帖最后由 cwhsmile 于 2019-4-27 12:44 编辑
方法不好,需要优化的地方多,列表对于超过一万以上的长度不建议用,最好用字典,长度低了就用列表。
慢慢的发现,思维方式不同,做出的结果可以差很多倍。import time
import math
def test1():
num = []
for m in range(2,28124):
li = [1]
for n in range(2,int(m**0.5)+1):
if m%n == 0:
li.append(n)
li.append(int(m/n))
if sum(set(li)) > m:
num.append(m)
long = len(num)
print(long)
print(num[-10:])
b = []
for n in range(long):
for i in range(n,long):
temp = num[i]+num[n]
if temp < 28124:
b.append(temp)
else:
break
print(b[-10:])
result = 0
b = set(b)
print(len(b))
for j in range(1,28124):
if j in b:
continue
result += j
return result
li = []
start = time.perf_counter()
print(test1())
end = time.perf_counter()
print(end-start)
上面的代码运行了5秒多,下面是改进的代码,把列表换成了字典,把过剩数相加的取值范围缩减了一下,3秒多运行完毕。import time
import math
def test1():
num = []
for m in range(2,28124):
li = [1]
for n in range(2,int(m**0.5)+1):
if m%n == 0:
li.append(n)
li.append(int(m/n))
if sum(set(li)) > m:
num.append(m)
long = len(num)
dict1 = {}
for a in range(28124):
dict1[a] = 1
for n in range(long//2):
for i in range(n,long-n):
temp = num[i]+num[n]
dict1[temp] = 0
result = 0
for j in range(28124):
if dict1[j] == 1:
result += j
return result
li = []
start = time.perf_counter()
print(test1())
end = time.perf_counter()
print(end-start)
|