Python入门100道习题(4)——换散币

题目描述

【问题描述】
将n元(n是100的倍数)换成用10元、5元、2元的组合(其中每一面值都可取0),一共有多少种组合?输入n,输出组合数。

【输入形式】
输入钱币总额n

【输出形式】
输出组合数

【样例输入】
100

【样例输出】
66

知识点

  1. for循环
  2. if语句
  3. 判一个整数是否是偶数

有问题的解法

shumu=int(input())

count = 0
for n10 in range(shumu // 10 + 1):
    for n5 in range(shumu // 5 + 1):
        for n2 in range(shumu // 2 + 1):
            if n10 * 10 + n5 * 5 + n2 * 2 == shumu:
                count += 1

print(count)

上述解法存在的问题是,如果输入的钱数n很大的话,程序运行时间过长。原因是上述程序的效率过低。以钱数是10000为例,循环的次数是1000 * 2000 * 5000。
下面的代码将在两个方面做出改进,提升效率。

正确的解法

shumu=int(input())

count = 0
for n10 in range(shumu // 10 + 1):
    for n5 in range((shumu - n10 * 10) // 5 + 1):
        if (shumu - n10 * 10 - n5 * 5) % 2 == 0:
            count += 1

print(count)

这个程序与上一个有问题的程序相比,有两点优化:
1. 减少了一重循环。为什么能减少呢?你想呀,当10块钱的张数和5块钱的张数定下来后,余下来的钱数是固定的,记作remain。要么,remain是偶数,能用2块钱凑齐;要么remain是奇数,不能用2块钱凑齐。能用2块钱凑齐,我们就增加1种换币组合。这里,压根儿不用去穷举2块钱的张数。这样,以钱数10000为例,循环的次数不大于1000 * 2000。
2. 减少了穷举5块钱张数的范围。做法是,shumu – n10 * 10,也就是减去10块钱凑起来的钱数。

小结

  1. 程序使用了双重循环,值得仔细辨析,直至熟练。
  2. 循环次数是影响程序效率的重要因素。
    原文作者:yeatcsdn
    原文地址: https://blog.csdn.net/yedouble/article/details/82218514
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞