Python编程之欧拉计划31~32
欧拉计划
欧拉计划(Project Euler)。
31、求换零钱的方法数
在英国,货币是由英镑 £,便士 p 构成的。一共有八种钱币在流通:
1p, 2p, 5p, 10p, 20p, 50p, £1 (100p) 和 £2 (200p).
要构造 £2 可以用如下方法:
1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p
允许使用任意数目的钱币,一共有多少种构造 £2 的方法?
分析:用动态规划法
# 换钱目标及零钱面值
aim = 200
arr = [1, 2, 5, 10, 20, 50, 100, 200]
ans = [1] + [0] * aim
for i in arr:
for k in range(i, aim + 1):
ans[k] += ans[k - i]
print(ans[aim])
输出:
73682
32、找出所有能够组合成 1 到 9 pandigital 的乘法算式中乘积的和
如果一个 n 位数使用了 1 到 n 中每个数字且只使用了一次,我们称其为 pandigital。例如,15234 这个五位数,是 1 到 5 pandigital 的。
7254 是一个不寻常的数,因为:39 × 186 = 7254 这个算式的乘数,被乘数和乘积组成了一个1到 9 的 pandigital 组合。
找出所有能够组合成 1 到 9 pandigital 的乘法算式中乘积的和。
提示: 有的乘积数字能够被多个乘法算式得到,所以在计算时要记得只计算它们一次。
# 若n是1到9的 pandigital 返回True
def pan(n): return len(n)==9 and "123456789".strip(n)==""
ans = set()
for i in range(1,98):
for j in range(123,9877):
if pan(str(i)+str(j)+str(i*j)):
ans.add(i*j)
print(f"{i}×{j}={i*j}")
print (sum(ans))
输出:
4×1738=6952
4×1963=7852
12×483=5796
18×297=5346
27×198=5346
28×157=4396
39×186=7254
42×138=5796
48×159=7632
45228