将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<stdio.h>
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;
}
运行结果: