Python编程之欧拉计划28~30
欧拉计划
欧拉计划(Project Euler)。
28、求1001×1001的螺旋中对角线上数字之和
从数字1开始向右顺时针方向移动,可以得到如下的5×5的螺旋:
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
可以算出对角线上数字之和是101.
1001×1001的螺旋中对角线上数字之和是多少?
分析:
n为奇数,右上角的元素为n×n,左上角的元素为n×n-n+1,左下角的元素为n×n-n+1-n+1,右下角的元素为n×n-n+1-n+1-n+1,单层为
4
n
2
−
6
n
+
6
4n^2-6n+6
4n2−6n+6
ans =1
for i in range(3,1002,2):
ans += 4*i*i -6*i +6
print(ans)
输出:
669171001
29、序列的项数
考虑
a
b
:
2
≤
a
≤
5
,
2
≤
b
≤
5
a^b : 2 ≤ a ≤ 5 , \quad 2 ≤ b ≤ 5
ab:2≤a≤5,2≤b≤5:
2
2
=
4
,
2
3
=
8
,
2
4
=
16
,
2
5
=
32
3
2
=
9
,
3
3
=
27
,
3
4
=
81
,
3
5
=
243
4
2
=
16
,
4
3
=
64
,
4
4
=
256
,
4
5
=
1024
5
2
=
25
,
5
3
=
125
,
5
4
=
625
,
5
5
=
3125
2^2=4, 2^3=8, 2^4=16, 2^5=32\\ 3^2=9, 3^3=27, 3^4=81, 3^5=243\\ 4^2=16, 4^3=64, 4^4=256, 4^5=1024\\ 5^2=25, 5^3=125, 5^4=625, 5^5=3125
22=4,23=8,24=16,25=3232=9,33=27,34=81,35=24342=16,43=64,44=256,45=102452=25,53=125,54=625,55=3125
如果将这些数字排序,并去除重复的,我们得到如下 15 个数字的序列:
4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125
a b : 2 ≤ a ≤ 100 , 2 ≤ b ≤ 100 a^b : 2 ≤ a ≤ 100 , \quad 2 ≤ b ≤ 100 ab:2≤a≤100,2≤b≤100 下生成的序列中有多少个不同的项?
print(len(set([a ** b for a in range(2, 101) for b in range(2, 101)])))
输出:
9183
30、找出所有能被写成各位数字五次方之和的数之和
令人惊奇的,只有三个数能够写成它们各位数的四次方之和:
1634
=
1
4
+
6
4
+
3
4
+
4
4
8208
=
8
4
+
2
4
+
0
4
+
8
4
9474
=
9
4
+
4
4
+
7
4
+
4
4
1634 = 1^4 + 6^4 + 3^4 + 4^4 \\ 8208 = 8^4 + 2^4 + 0^4 + 8^4 \\ 9474 = 9^4 + 4^4 + 7^4 + 4^4
1634=14+64+34+448208=84+24+04+849474=94+44+74+44
1 = 14 没有被算作在内因为它不是一个和。
这些数字的和是 1634 + 8208 + 9474 = 19316.
找出所有能被写成各位数字五次方之和的数之和。
分析:
显热符合要求的数不会大于
6
×
9
5
=
354294
6\times9^5=354294
6×95=354294
ans = []
for i in range(100, 354294):
if sum(n ** 5 for n in map(int, list(str(i)))) == i:
ans.append(i)
print(sum(ans), ans)
输出:
443839 [4150, 4151, 54748, 92727, 93084, 194979]