C语言经典问题——兑换硬币
兑换硬币问题
兑换硬币问题是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语言经典问题——兑换硬币相关推荐
- c语言 swap交换函数_C语言经典100题(14)
1 上期答案揭晓 首先给大家看看上一篇文章C语言经典100题(13)中第三部分编程题的答案: #includeint main(){ int i,x,y,z; for(i=100;i<1000; ...
- 求一批整数中出现最多的个位数字_C语言经典100例007-求低n-1位的数
系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...
- C语言经典例98-将字符转为大写字母并写入文件
目录 1 题目 2 分析 3 实现 1 题目 从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存. 输入的字符串以!结束. 2 分析 写入 ...
- C语言经典例19-完数
目录 1 题目 2 分析 3 实现 4 运行结果 1 题目 一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程找出1000以内的所有完数. 因子:假如整 ...
- C语言经典算法 21-30
目录 21 一个有序的数组插入一个数 22 将一个数组逆序输出 23 报号 求最后是谁 24 写一个统计字符串长度的函数 25 八进制转换为十进制 26 判断一个素数能被几个 9 整除 27 输入一组 ...
- C语言经典算法 11-20
C语言经典算法 11-20 十一.求最大公约数和最小公倍数 十二.统计字符串数字,字母,符号的各个数量 十三.2+22+222+..... 十四.完数 十五.小球反弹问题 十六.猴子吃桃问题 十七.求 ...
- C语言经典算法 1-10
目录 一.排列组合题 二.区间题 三.判断平方数相关 四.给你一个年月日判断是第几天 五.将3个数由小到大排序 六.九九乘法表 七.兔子繁殖数列 八.判断素数 九.水仙花数 十.因数分解 一.排列组合 ...
- c语言超长编程程序,全国青少年软件编程等级考试C语言经典程序题10道五
全国青少年软件编程等级考试C语言经典程序题10道五 [程序41] 题目:学习static定义静态变量的用法 1.程序分析: 2.程序源代码: #include "stdio.h" ...
- c语言编程 输入螺旋数组,C语言 经典题目螺旋矩阵 实例详解
C语言 经典题目螺旋矩阵 实例详解 C语言 经典题目螺旋矩阵 //N阶螺旋矩阵 #include #include int main() { int N,i,j,n,num=1; int a[10][ ...
最新文章
- 斯坦福马腾宇:用显式正则器提升深度神经网络的泛化能力
- linux下软件实施,linux系统未来或应用广泛
- boost::math::tools::sum_series用法的测试程序
- 数据库领域 TOP10 热门课程推荐 | 最棒的课程给最好的你
- 485. Max Consecutive Ones
- 【剑指offer】面试题68 - I:二叉树的最近公共祖先(Java)
- java xml 读取库_Java开发中读取XML与properties配置文件的方法
- Java笔记-通过反射获取注解及Spring中获取某包下的所有class文件
- WAV格式中常见的压缩编码
- It seems that scikit-learn has not been built correctly.
- 外网不能访问图片的问题
- Flink 1.11 新特性之 SQL Hive Streaming 简单示例
- eclipse j2me 连接 KEmulator模拟器
- [编程思想] POP OOP AOP
- 飞思卡尔单片机RAM与flash相关问题
- Falcon(一)——数据集管理和数据处理平台
- linux更新war包操作步骤,关于Linux系统下基于Tomcat部署和升级war包的详细过程
- win7计算机打开显卡设置在哪,[win7显卡设置在哪里]WIN7显卡优化设置在哪
- Kanade Loves Maze Designing
- openssl 签发证书相关命令