Python编程之欧拉计划21~22

该博客探讨了如何使用Python解决欧拉计划的两个问题:计算10000以内亲和数之和,以及文件中所有名字按字母排序后的得分总和。通过实例解释了解题思路和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欧拉计划

欧拉计划(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值