Python编程之欧拉计划21~22
欧拉计划
欧拉计划(Project Euler)。
21、求10000以内所有亲和数之和
记d(n)为n 的所有真因子(小于 n 且能整除 n 的整数)之和。 如果 d(a) = b 并且 d(b) = a, 且 a ≠ b, 那么 a 和 b 就是一个亲和数对(amicable pair),并且 a 和 b 都叫做亲和数(amicable number)。
例如220的真因子是 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 和 110; 因此 d(220) = 284. 284的真因子是1, 2, 4, 71 和142; 所以d(284) = 220.
计算10000以下所有亲和数之和。
分析:反正这不难
def d(n):
return sum(i for i in range(1,n//2+1) if n%i ==0)
ans = 0
for a in range(2,10000):
b=d(a)
if a!=b and a==d(b):
ans += a
print(ans)
输出:
31626
22、文件中所有名字的得分总和
文件names.txt (右键另存为)是一个46K大小的文本文件,包含5000多个英文名字。利用这个文件,首先将文件中的名字按照字母排序,然后计算每个名字的字母值,最后将字母值与这个名字在名字列表中的位置相乘,得到这个名字的得分。
例如将名字列表按照字母排序后, COLIN这个名字是列表中的第938个,它的字母值是3 + 15 + 12 + 9 + 14 = 53。所以COLIN这个名字的得分就是938 × 53 = 49714.
文件中所有名字的得分总和是多少?
def name_value(name):
return sum(ord(c) - ord('A') + 1 for c in name)
f = open("names.txt")
lst = f.readline().split(",")
lst.sort()
score = 0
for i, s in enumerate(lst):
s = s.replace('"', '')
score += name_value(s) * (i + 1)
print(score)
f.close()
输出:
871198282