c语言的硬币兑换问题(类似百钱百鸡)

问题描述:

我有一枚一块和五角的硬币,现在要把它兑换成一分、两分、五分的硬币总共要兑换100枚硬币,并且规定每一种数额的硬币都至少有一枚。问我怎样兑换满足?有几种对换方法?

思路:首先我们先要进行一次单位换算题目里的一块五角是150分,然后需要看到限制条件如每种数额的硬币都至少有一枚,关键还要完成对种数的记录。

这里我们可以借鉴一个百钱百鸡的例子:

公鸡5钱一只,母鸡3钱一只,小鸡1钱三只。100钱买100只鸡。问公鸡、母鸡、小鸡各几只?(这里用到了穷举法)

参考代码如下:

#include <stdio.h> int main() { int a,b,c; for(a=0;a<=20;a++) { for(b=0;b<=33;b++) { for(c=0;c<=100;c++) { if(a+b+c=100&&15*a+9*b+c=300) { printf("%d,%d,%d\n",a,b,c); } } } } return 0; }

可以看到这两题具有相似性只是本题在此基础上增加了一定的限制条件:至少有一种,还要记录一下结果种数。

然后根据这个百钱百鸡问题我们可以注意到:

(1)至少要定义四个变量,三个用于表示个数额硬币,一个用于记录种数。

(2)需要使用for循环来进行穷举各种方法。

(3)通过它们之间的数学关系在进行条件选择。

在这里我们可以先拆分问题如先完成问题一,再进行种数的记录。

问题一参考代码如下:

#include <stdio.h>
int main()
{
	int a,b,c;
	for(a=1;a<=100;a++)
	{
		for(b=1;b<=50;b++)
		{
			for(c=100-(a+b);c<=20;c++)//这里用100-(a+b)代替了c的初始值//
			{
				if(a+b+c==100&&a+b*2+c*5==150&&a>=1&&b>=1&&c>=1)
				{
					printf("%d,%d,%d\n",a,b,c);
				}
			}
		}
	}  
	return 0;
}

最后在此基础之上我们进行对种数的记录:

这里我使用的是对一个变量自增的方法及每出现一次种数就自增加一(需要其在种数输出位置一起变化应该与其在同一语句)最后对其值进行打印。参考代码如下:

#include <stdio.h>
int main()
{
	int a,b,c,d;
	for(a=1;a<=100;a++)
	{
		for(b=1;b<=50;b++)
		{
			for(c=100-(a+b);c<=20;c++)
			{
				if(a+b+c==100&&a+b*2+c*5==150&&a>=1&&b>=1&&c>=1)
				{
					printf("%d,%d,%d\n",a,b,c);
					d++;
				}
			}
		}
	}   printf("种数:%d\n",d);
	return 0;
}