Python编程之欧拉计划(13-15)
欧拉计划
欧拉计划(Project Euler)。
13、求100个大数的和的前10位数字
100个数字我就不写了,放入个文本文件中去。读出来直接相加就行了。最后用肉眼判断前10位数字○| ̄|_
f = open("100numbers.txt")
print(sum(int(line) for line in f.readlines()))
f.close()
输出:
5537376230390876637302048746832985971773659831892672
14、最长的考拉兹序列
在正整数集上定义如下的迭代序列:
n ----> n/2 (若n为偶数) n ----> 3n + 1 (若n为奇数)
从13开始应用上述规则,我们可以生成如下的序列:
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1。
可以看出这个序列(从13开始到1结束)共有10项。虽然还没有被证明,但普遍认为,从任何数开始最终都能迭代至1(这就是“考拉兹猜想”)。计算从小于一百万的哪个数开始,生成的序列最长。
# 初始13为10步
c_max,n_max = 10,13
for i in range(14,1000000):
num,cout = i,1
while num != 1: #while 循环总会退出的
if num %2 ==0:
num = num // 2
else:
num = num *3 +1
cout +=1
if c_max < cout: # 退出while时若步数更多则保存步数及对应数字
c_max,n_max = cout,i
print(c_max,n_max)
输出:
525 837799
15、求网格路径数量
从一个2×2方阵的左上角出发,只允许向右或向下移动,则恰好有6条通往右下角的路径。
对于20×20方阵来说,这样的路径有多少条?
分析:相当于走40步,其中20步向右,20步向下,总的走法数量也就是 直接计算就行了
from operator import mul
from functools import reduce
# 计算组合数C(40,20)
print(reduce(mul,range(21,41))//reduce(mul,range(1,21)))
输出:
137846528820