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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值