兑换硬币问题

  兑换硬币问题是C语言的一个经典问题。题目如下:

现有一张1元纸币,欲将其兑换为1分、2分、5分硬币共60枚,请列出所有兑换方案。

  我们可以利用分支和循环来解决这个问题。

最简单的方法——三重循环法

  最“无脑”也是最容易想到的方法是利用三重循环。其代码如下所示:

#include <stdio.h>
int main (void)
{int i = 0; int one, two, five; for (one = 0; one <= 60; one++){for (two = 0; two <= 50; two++){for (five = 0; five <= 20; five++){if ((one * 1 + two * 2 + five * 5 == 100) && (one + two + five == 60)){i++; printf ("兑换方案%2d:1分硬币%2d枚,2分硬币%2d枚,5分硬币%2d枚\n", i, one, two, five); }}}}printf ("共有%d种兑换方案\n", i); return 0;
}

  输出结果如下:

兑换方案 1:1分硬币20枚,2分硬币40枚,5分硬币 0枚
兑换方案 2:1分硬币23枚,2分硬币36枚,5分硬币 1枚
兑换方案 3:1分硬币26枚,2分硬币32枚,5分硬币 2枚
兑换方案 4:1分硬币29枚,2分硬币28枚,5分硬币 3枚
兑换方案 5:1分硬币32枚,2分硬币24枚,5分硬币 4枚
兑换方案 6:1分硬币35枚,2分硬币20枚,5分硬币 5枚
兑换方案 7:1分硬币38枚,2分硬币16枚,5分硬币 6枚
兑换方案 8:1分硬币41枚,2分硬币12枚,5分硬币 7枚
兑换方案 9:1分硬币44枚,2分硬币 8枚,5分硬币 8枚
兑换方案10:1分硬币47枚,2分硬币 4枚,5分硬币 9枚
兑换方案11:1分硬币50枚,2分硬币 0枚,5分硬币10枚
共有11种兑换方案

稍加改进——双重循环法

  通过分析上面的程序,我们可以发现,通过利用变量one,two和five之间的关系,即one+two+five=60,我们可以减少一层循环,从而达到代码的优化。改进后的代码如下:

#include <stdio.h>
int main(void)
{int i = 0;int one, two, five;for (five = 0; five < 20; five++){for (two = 0; two < 50; two++){one = 60 - two - five;if (one + two * 2 + five * 5 == 100){i++;printf ("兑换方案%2d:1分硬币%2d枚,2分硬币%2d枚,5分硬币%2d枚\n", i, one, two, five);}}}printf ("共有%d种兑换方案\n", i); return 0;
}

  输出结果如下:

兑换方案 1:1分硬币20枚,2分硬币40枚,5分硬币 0枚
兑换方案 2:1分硬币23枚,2分硬币36枚,5分硬币 1枚
兑换方案 3:1分硬币26枚,2分硬币32枚,5分硬币 2枚
兑换方案 4:1分硬币29枚,2分硬币28枚,5分硬币 3枚
兑换方案 5:1分硬币32枚,2分硬币24枚,5分硬币 4枚
兑换方案 6:1分硬币35枚,2分硬币20枚,5分硬币 5枚
兑换方案 7:1分硬币38枚,2分硬币16枚,5分硬币 6枚
兑换方案 8:1分硬币41枚,2分硬币12枚,5分硬币 7枚
兑换方案 9:1分硬币44枚,2分硬币 8枚,5分硬币 8枚
兑换方案10:1分硬币47枚,2分硬币 4枚,5分硬币 9枚
兑换方案11:1分硬币50枚,2分硬币 0枚,5分硬币10枚
共有11种兑换方案

  我们得到了相同的输出结果,可见这种想法是可行的。

最优方法——单重循环法

  实际上,这道题只用单重循环也是可以解决的。
  我们再次对变量one,two和five之间的关系进行分析,不难得出以下两个关系式:

one + two + five = 60
one + two × 2 + five × 5 = 100

  整理之后,得:

two + five × 4 = 40,即 two = 40 - five × 4
five ≤ 10

  根据上面的分析,我们可以再次优化代码,如下所示:

#include <stdio.h>
int main(void)
{int i = 0;int one, two, five;for (five = 0; five <= 10; five++){two = 40 - 4 * five;one = 60 - two - five;if (one + two * 2 + five * 5 == 100){i++;printf ("兑换方案%2d:1分硬币%2d枚,2分硬币%2d枚,5分硬币%2d枚\n", i, one, two, five);}}printf ("共有%d种兑换方案\n", i); return 0;
}

  输出结果依旧和上面的两个程序相同:

兑换方案 1:1分硬币20枚,2分硬币40枚,5分硬币 0枚
兑换方案 2:1分硬币23枚,2分硬币36枚,5分硬币 1枚
兑换方案 3:1分硬币26枚,2分硬币32枚,5分硬币 2枚
兑换方案 4:1分硬币29枚,2分硬币28枚,5分硬币 3枚
兑换方案 5:1分硬币32枚,2分硬币24枚,5分硬币 4枚
兑换方案 6:1分硬币35枚,2分硬币20枚,5分硬币 5枚
兑换方案 7:1分硬币38枚,2分硬币16枚,5分硬币 6枚
兑换方案 8:1分硬币41枚,2分硬币12枚,5分硬币 7枚
兑换方案 9:1分硬币44枚,2分硬币 8枚,5分硬币 8枚
兑换方案10:1分硬币47枚,2分硬币 4枚,5分硬币 9枚
兑换方案11:1分硬币50枚,2分硬币 0枚,5分硬币10枚
共有11种兑换方案

C语言经典问题——兑换硬币相关推荐

  1. c语言 swap交换函数_C语言经典100题(14)

    1 上期答案揭晓 首先给大家看看上一篇文章C语言经典100题(13)中第三部分编程题的答案: #includeint main(){ int i,x,y,z; for(i=100;i<1000; ...

  2. 求一批整数中出现最多的个位数字_C语言经典100例007-求低n-1位的数

    系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...

  3. C语言经典例98-将字符转为大写字母并写入文件

    目录 1 题目 2 分析 3 实现 1 题目 从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存. 输入的字符串以!结束. 2 分析 写入 ...

  4. C语言经典例19-完数

    目录 1 题目 2 分析 3 实现 4 运行结果 1 题目 一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. 因子:假如整 ...

  5. C语言经典算法 21-30

    目录 21 一个有序的数组插入一个数 22 将一个数组逆序输出 23 报号 求最后是谁 24 写一个统计字符串长度的函数 25 八进制转换为十进制 26 判断一个素数能被几个 9 整除 27 输入一组 ...

  6. C语言经典算法 11-20

    C语言经典算法 11-20 十一.求最大公约数和最小公倍数 十二.统计字符串数字,字母,符号的各个数量 十三.2+22+222+..... 十四.完数 十五.小球反弹问题 十六.猴子吃桃问题 十七.求 ...

  7. C语言经典算法 1-10

    目录 一.排列组合题 二.区间题 三.判断平方数相关 四.给你一个年月日判断是第几天 五.将3个数由小到大排序 六.九九乘法表 七.兔子繁殖数列 八.判断素数 九.水仙花数 十.因数分解 一.排列组合 ...

  8. c语言超长编程程序,全国青少年软件编程等级考试C语言经典程序题10道五

    全国青少年软件编程等级考试C语言经典程序题10道五 [程序41] 题目:学习static定义静态变量的用法 1.程序分析: 2.程序源代码: #include "stdio.h" ...

  9. c语言编程 输入螺旋数组,C语言 经典题目螺旋矩阵 实例详解

    C语言 经典题目螺旋矩阵 实例详解 C语言 经典题目螺旋矩阵 //N阶螺旋矩阵 #include #include int main() { int N,i,j,n,num=1; int a[10][ ...

最新文章

  1. 斯坦福马腾宇:用显式正则器提升深度神经网络的泛化能力
  2. linux下软件实施,linux系统未来或应用广泛
  3. boost::math::tools::sum_series用法的测试程序
  4. 数据库领域 TOP10 热门课程推荐 | 最棒的课程给最好的你
  5. 485. Max Consecutive Ones
  6. 【剑指offer】面试题68 - I:二叉树的最近公共祖先(Java)
  7. java xml 读取库_Java开发中读取XML与properties配置文件的方法
  8. Java笔记-通过反射获取注解及Spring中获取某包下的所有class文件
  9. WAV格式中常见的压缩编码
  10. It seems that scikit-learn has not been built correctly.
  11. 外网不能访问图片的问题
  12. Flink 1.11 新特性之 SQL Hive Streaming 简单示例
  13. eclipse j2me 连接 KEmulator模拟器
  14. [编程思想] POP OOP AOP
  15. 飞思卡尔单片机RAM与flash相关问题
  16. Falcon(一)——数据集管理和数据处理平台
  17. linux更新war包操作步骤,关于Linux系统下基于Tomcat部署和升级war包的详细过程
  18. win7计算机打开显卡设置在哪,[win7显卡设置在哪里]WIN7显卡优化设置在哪
  19. Kanade Loves Maze Designing
  20. openssl 签发证书相关命令

热门文章

  1. 地铁三号线 - 95后的财务自由
  2. 使用高德地图 地址一经纬度 之间相互转化的实例代码 python
  3. word表格换页自动续前表的方法
  4. 如何下载旧版本R和R包?
  5. 苹果白屏一直显示苹果_苹果6白屏如何解决,iPhone6白苹果开不了机怎么办
  6. 如何刷机:iphone8锁屏密码错误多次,手机停用,连接iTunes,磁盘已满,双重认证弊端!
  7. 进大厂必备的Java八股文大全(2022最强精简易懂版)
  8. codeforces1379B Dubious Cyrpto
  9. 【经济学视频课程】力量F的属性与…
  10. 02.集线器,网桥,交换机