这两天正在做C语言的练习题,突然看到了这个问题,本来已经做完了想上网搜一下竟然发现没有几个正确答案,那就我来写一个吧。(主要是比我猛的人也不屑于写这个了,狗头)、
思路解析:- 首先要区分的一个概念就是钱数和张数,这个问题我只能说我们心里都明白可是不好用计算机来表达。既然这样那就多设几个变量便于看清楚。
- 理清思路100元换成1元,5元,10元的零钱,最容易换的就是10元。因为10是1,5,10的最小公倍数。这么做总会为后边较小的数留出空间来计算其他值。
- 用100去除(我分不清除和除以总之就是100/10)这样就能得到最多换10张10元,0张1元和5元。
- 所以最多10张,如果9张10元呢,这时候定义变量1<=i<=10 循环就可以了
- 设开始第1次循环后换出来了1个10元,剩余90元
- 这90元再去用于除5(90/5)最多会有18张5元。所以最多18张,如果是17张呢,再定义变量1<=j<=18
- 设开始嵌套循环的第1次循环换出来了1个五元
- 那么剩下的就不用说了嘛,五元十元的都换完了,剩下的一元就不需要这样分析了,因为一元的价值量等于其数量。即剩下的全是一元
void exchange() { const int a = 100; int m_10 = 0, m_5 = 0, m_1 = 0; //金额 int n_10 = 0, n_5 = 0, n_1 = 0; //个数 int sum = 0; printf("可交换数量如下(单位:张)n"); printf("t1元t5元t10元n"); for (n_10 = 1;n_10 <= 10; n_10++) { m_10 = a - 10 * n_10; for (n_5 = 1; n_5 <= m_10 /5; n_5++) { m_5 = m_10 - 5 * n_5; { m_1 = m_5 * 1; n_1 = m_1; } if(n_1 != 0) { sum++; printf("t%dt%dt%dn", n_1, n_5, n_10); } } } printf("共%d种n", sum); }
说明一下:
- 复合语句m_1那两行纯属是为了增加可读性,完全可以直接赋值而且其中的金额变量也完全可以去掉直接替换成相应的赋值语句放在变量名处即可。
- if条件是为了保证每个面额的纸币都大于0,没有这个要求可以不加。另外可能有其他要求,按照要求调整语句即可。
- 另外,一开始容易犯的错误就是第二次循环的条件没有考虑到已经换出了10元的面额通常会直接写成1<=j<=20。在我第一次跑程序的时候 也是这么搞得。。。后来1元出现了负数就回头想了一下。
- 晚安!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)