兑换硬币问题

  兑换硬币问题是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. int(1) 和 int(10) 的区别?很多老程序都理解错了!
  2. History(历史)命令用法
  3. 8种优秀预训练模型大盘点,NLP应用so easy!
  4. 【Verilog HDL】设计硬件电路时,如何避免生成锁存器?
  5. 通配符在泛型中的应用
  6. hive链接mysql的shell命令_Hive shell 基本命令
  7. 前端为什么要使用组件化的思想,通过一个实例来分析
  8. 单元测试反模式,完整列表
  9. Cannot find module '@babel/plugin-proposal-class-properties'
  10. Could not create directory F:\Qt\Test\Error in Util.asciify(build-First_02-Desktop_Qt_5_6_3_Min
  11. 2021信服云创新峰会:托管云成上云第三种选择
  12. 转行人工智能,不得不温故的数学基础知识
  13. dev Gridcontrol控件属性部分
  14. 你认识的老罗又回来了!罗永浩:我的创造力才刚刚开始猥琐发育
  15. java远程执行jmi,java调用matlab 时出现java.lang.NullPointerException错误
  16. maze3D-一款三维迷宫游戏
  17. Jmeter脚本录制
  18. 微信公众号小程序与服务号和订阅号有什么区别
  19. magento php mysql_magento 资源配置 mysql4-install-0.1.0.php为什么没有执行
  20. 22.3 MIDI 和音乐

热门文章

  1. Entity Framework Core系列教程-3为现有数据库生成实体模型
  2. unittest教程(2w字实例合集)——Python自动化测试一文入门
  3. 太可怕啦!AI 一秒还原马赛克,有码变高清
  4. 【教程搬运】读懂github上的工程代码——带你熟悉Python中的Parser
  5. 天津化工杂志天津化工杂志社天津化工编辑部2022年第3期目录
  6. QT实现简单的上位机软件
  7. Codeforces B. Dubious Cyrpto (枚举 / 模拟) (Round #657 Div.2)
  8. sql超键 候选键 主键
  9. 用USART接口代替SPI怎么做?
  10. APP/网站性能优化方案汇总