Python编程之欧拉计划23~25
欧拉计划
欧拉计划(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=Fn−1+Fn−2
第一个有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