一元硬币的组合
- 算法思路:
1、一元硬币可以分成1、2、5角等组成
2、可以采用控制变量来进行枚举试验;
3、将可以构成指定元的组合方案进行输出。 - 代码如下:
#include<stdio.h>
int main()
{
int x;
int one,two,five;
printf("请输入元:");
scanf("%d",&x);
for(one = 1; one < x*10;one++){
for(two = 1;two<x*10/2;two++){
for(five =1;five<x*10/5;five++){
if(one+two*2+five*5==x*10)
printf("可以用%d个一角加%d个二角加%d个5角得到%d元\n",
one,two,five,x);
}
}
}
return 0;
}
输出结果:
请输入元:1
可以用1个一角加2个二角加1个5角得到1元
可以用3个一角加1个二角加1个5角得到1元
--------------------------------
Process exited after 1.101 seconds with return value 0
请按任意键继续. . .
代码分析:
这里的三重循环用的是控制变量的方法,当one=1时循环进入two;two=1时循环进入five;five=1时发现if语句one+two2+five5==x*10为假,随即跳出循环two++执行后two=2,在进入five循环,以此类推;可以在Dev C++中设置断点后,使用debug来观察下程序的具体运行步骤。
凑硬币(只找一种方案)
- 代码思路:
只要一种方案就要求对其它存在的方案进行打断,即跳出当前所有的循环语句;
这时候需要用到break语句进行接力。 - 代码如下:
#include<stdio.h>
int main()
{
int x;
int one,two,five;
int exit = 0;
printf("请输入元:");
scanf("%d",&x);
for(one = 1; one < x*10;one++){
for(two = 1;two<x*10/2;two++){
for(five =1;five<x*10/5;five++){
if(one+two*2+five*5==x*10){
printf("可以用%d个一角加%d个二角加%d个5角得到%d元\n",
one,two,five,x);
exit = 1;
break;
}
}
if(exit==1) break;
}
if(exit==1) break;
}
return 0;
}
代码输出:
请输入元:2
可以用1个一角加2个二角加3个5角得到2元
--------------------------------
Process exited after 1.112 seconds with return value 0
请按任意键继续. .
代码分析:
这个程序巧妙之处在于当最内层循环的条件语句不运行时,不会发生打断其它的循环进程,一旦最内层循环进程被执行时,设置的break计数器便发生改变,从而影响其它循环进程不执行,相当于链式反应,直接跳出所有循环,这里break计数变量设置的十分巧妙。
- goto函数实现凑硬币
代码如下:
//凑硬币goto函数
#include<stdio.h>
int main()
{
int x;
int one,two,five;
int exit = 0;
printf("请输入元:");
scanf("%d",&x);
for(one = 1; one < x*10;one++){
for(two = 1;two<x*10/2;two++){
for(five =1;five<x*10/5;five++){
if(one+two*2+five*5==x*10){
printf("可以用%d个一角加%d个二角加%d个5角得到%d元\n",
one,two,five,x);
goto out;
}
}
}
}
out:
return 0;
}
程序输出:
请输入元:2
可以用1个一角加2个二角加3个5角得到2元
--------------------------------
Process exited after 1.652 seconds with return value 0
请按任意键继续. . .
代码分析:
goto函数可以便捷的实现多重循环中的跳转,不过慎用goto函数以免造成不必要麻烦;另外大型项目为了便于维护,一般不使用goto。