Python编程之欧拉计划23~25

本文介绍了如何使用Python解决欧拉计划中的三个问题:23题探讨过盈数之和,24题寻找特定字典序排列,25题找到斐波那契数列中第一个1000位数字的项数。通过分析和计算,得出相应答案。
摘要由CSDN通过智能技术生成

欧拉计划

欧拉计划(Project Euler)。

23、找出所有不能表示为两个过盈数之和的正整数之和

如果一个数的所有真因子之和等于这个数,那么这个数被称为完全数。例如,28的所有真因子之和为1 + 2 + 4 + 7 + 14 = 28,所以28是一个完全数。

如果一个数的所有真因子之和小于这个数,称其为不足数,如果大于这个数,称其为过盈数。

12是最小的过盈数,1 + 2 + 3 + 4 + 6 = 16。因此最小的能够写成两个过盈数之和的数字是24。经过分析,可以证明所有大于28123的数字都可以被写成两个过盈数之和。但是这个上界并不能被进一步缩小,即使我们知道最大的不能表示为两个过盈数之和的数字要比这个上界小。

找出所有不能表示为两个过盈数之和的正整数之和。

分析:题目这句话不太好理解,既然大于28123的数都可以表示为过盈数之和,28123本身也可以表示为两个过盈数之和,这不就证明了所有大于28122的数都可以写成两个过盈数之和了吗?这上界不就缩小了吗?
从解题中可以发现最大的不能表示为两个过盈数之和的数为 20161,也就是所有大于20161的数都可以表示为两个过盈数之和

def d(n):
    return sum(i for i in range(1,n//2+1) if n%i ==0)

# 生成过盈数列表和字典
lst= [a for a in range(12,28124-12) if a < d(a)]
dct = dict.fromkeys(lst, True)

ans = 0
for n in range(1, 28124):
    not_sum = True
    # 若 a 是过盈数,n-a也是过盈数,即 n 为两个过盈数之和
    for a in lst:
        if a < n and dct.get(n - a):
            not_sum = False
            break
    if not_sum:
        ans += n

print(ans)

输出:
4179871

24、找出数字0、1、2、3、4、5、6、7、8、9的字典序排列中第一百万位的排列

排列是一个物体的有序安排。例如3124是1,2,3,4的一种排列。如果所有的排列按照数值或者字母序排序,我们称其为一个字典序。0,1,2的字典排列有:

012 021 102 120 201 210

数字0、1、2、3、4、5、6、7、8、9的字典序排列中第一百万位的排列是什么?

分析:库里有的就用库吧

from itertools import permutations

for i,x in enumerate(permutations(range(10))):
    if i == 1000000-1:
        print(i,x)
        break

输出:
999999 (2, 7, 8, 3, 9, 1, 5, 4, 6, 0)

25、斐波那契数列中,第一个有1000位数字的是第几项

斐波那契数列是按如下递归关系定义的数列:
F 1 = 1 , F 2 = 1 F_1 = 1, F_2 = 1 F1=1,F2=1
F n = F n − 1 + F n − 2 F_n = F_{n−1} + F_{n−2} Fn=Fn1+Fn2
第一个有3位数字的是第12项:
F 11 = 89 F_{11} = 89 F11=89
F 12 = 144 F_{12} = 144 F12=144

在斐波那契数列中,第一个有1000位数字的是第几项?

分析:转换为str来判断位数

# 生成斐波那契数列,判断位数
a, b, fn, n = 1, 1, 2, 1000
while len(str(b)) < n:
    a, b = b, a + b
    fn += 1
print(fn)

输出:
4782

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值