一元硬幣的組合
- 算法思路:
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。