换硬币的c语言程序流程图,C语言换分币问题

问题描述

将5元的人民币兑换成1元、5角和1角的硬币,共有多少种不同的兑换方法。

问题分析

根据该问题的描述,可将该问题抽象为一个不定方程。

设变量x、y和z分别代表兑换的1元、5角和1角的硬币所具有的钱数(角),则由题目的要求,可得到方程:

x+y+z=50

其中,x为兑换的1元硬币钱数,其可能的取值为 {0,10,20,30,40,50},y为兑换的5角硬币钱数,其可能的取值为 {0,5,10,15,20,25,30,35,40,45,50},z为兑换的1角硬币钱数,其可能的取值为 {0,1,...,50}。

算法设计

在问题分析中,我们得到了一个不定方程 x+y+z=50,显然该不定方程会有多组解。根据题意可知x、y和z的可能取值,将它们所有可能取值的组合代入方程中,能使该方程成立的那些解即为该问题的解。

为实现该功能,需要使用3个嵌套的for循环语句。

下面是完整的代码:

#include

int main()

{

int x, y, z, count=1;

printf("可能的兑换方法如下:\n");

for( x=0; x<=50; x+=10 ) /*x为1元硬币钱数,其取值为0,10,20,30,40,50*/

for( y=0; y<=50-x; y+=5 ) /*y为5角硬币钱数,其取值为0,5,10,15,20,25,30,35,40,,45,50*/

for( z=0; z<=50-x-y; z++) /*z为1角硬币钱数,其取值为0,1,...50*/

if(x+y+z==50)

{

/*输出时,每行最多三种情况*/

printf(count%3 ? "%d: 10*%d+5*%d+1*%d\t" : "%d:10*%d+5*%d+1*%d\n", count, x/10, y/5, z);

count++;

}

return 0;

}

运行结果:

可能的兑换方法如下:

1: 10*0+5*0+1*50 2: 10*0+5*1+1*45 3:10*0+5*2+1*40

4: 10*0+5*3+1*35 5: 10*0+5*4+1*30 6:10*0+5*5+1*25

7: 10*0+5*6+1*20 8: 10*0+5*7+1*15 9:10*0+5*8+1*10

10: 10*0+5*9+1*5 11: 10*0+5*10+1*0 12:10*1+5*0+1*40

13: 10*1+5*1+1*35 14: 10*1+5*2+1*30 15:10*1+5*3+1*25

16: 10*1+5*4+1*20 17: 10*1+5*5+1*15 18:10*1+5*6+1*10

19: 10*1+5*7+1*5 20: 10*1+5*8+1*0 21:10*2+5*0+1*30

22: 10*2+5*1+1*25 23: 10*2+5*2+1*20 24:10*2+5*3+1*15

25: 10*2+5*4+1*10 26: 10*2+5*5+1*5 27:10*2+5*6+1*0

28: 10*3+5*0+1*20 29: 10*3+5*1+1*15 30:10*3+5*2+1*10

31: 10*3+5*3+1*5 32: 10*3+5*4+1*0 33:10*4+5*0+1*10

34: 10*4+5*1+1*5 35: 10*4+5*2+1*0 36:10*5+5*0+1*0

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值