C語言:湊硬幣(兩元硬幣的組合方案)

一元硬幣的組合

  1. 算法思路:
    1、一元硬幣可以分成1、2、5角等組成
    2、可以採用控制變量來進行枚舉試驗;
    3、將可以構成指定元的組合方案進行輸出。
  2. 代碼如下:
#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個二角加15角得到1元
		可以用3個一角加1個二角加15角得到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來觀察下程序的具體運行步驟。

湊硬幣(只找一種方案)

  1. 代碼思路:
    只要一種方案就要求對其它存在的方案進行打斷,即跳出當前所有的循環語句;
    這時候需要用到break語句進行接力。
  2. 代碼如下:
#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個二角加35角得到2--------------------------------
		Process exited after 1.112 seconds with return value 0
		請按任意鍵繼續. .

代碼分析:
這個程序巧妙之處在於當最內層循環的條件語句不運行時,不會發生打斷其它的循環進程,一旦最內層循環進程被執行時,設置的break計數器便發生改變,從而影響其它循環進程不執行,相當於鏈式反應,直接跳出所有循環,這裏break計數變量設置的十分巧妙。

  1. 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個二角加35角得到2--------------------------------
		Process exited after 1.652 seconds with return value 0
		請按任意鍵繼續. . .

代碼分析:
goto函數可以便捷的實現多重循環中的跳轉,不過慎用goto函數以免造成不必要麻煩;另外大型項目爲了便於維護,一般不使用goto。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章