算法編程例題——枚舉法

例一:百錢買白雞

1,問題描述:

公雞每隻5元,母雞每隻3元,三隻小雞1元,用100元買100只雞,問公雞、母雞、小雞各多少隻?


例二:使用枚舉法解決“填寫運算符問題”

1,問題描述:在下面的算式中,添加“+”、“-”,“*”,“/”,4個運算符,使得這個式子成立。

5  5  5  5  5=5

例一:

public static void buyChicken() {
		int gj = 0;
		int mj = 0;
		int xj = 0;
		int sum = 0;
		for (gj = 0; gj < 20; gj++) {
			for (mj = 0; mj <= 33; mj++) {
				xj = 100 - mj - gj;
				if (xj % 3 == 0 && xj * 1 / 3 + 5 * gj + 3 * mj == 100) {
					System.out.println("公雞:" + gj + "母雞:" + mj + "小雞:" + xj);
				}
			}
		}
	}

例二:

public static void yunSuan() {
		int j = 0;   //遍歷變量
		int i[] = new int[5];//表示四個運算符
		int sign;//累加運算時的符號
		int result = 0;//最終運算結果
		int count = 0;//可能的結果數

		float left, right;//運算過程中位於符號左右的結果

		char oper[] = { ' ', '+', '-', '*', '/' };//char型符號,用於打印
		Scanner a = new Scanner(System.in);//輸入五個操作數和想要獲得的運算結果
		int n = 6;
		int[] arr = new int[n];
		for (int m = 0; m < n; m++) {//將輸入的五個數放入數組
			int x = a.nextInt();
			arr[m] = x;
		}
		for (int y = 0; y < arr.length; y++) {//打印需要運算的五個數
			System.out.print(arr[y]);
		}
		for (i[1] = 1; i[1] <= 4; i[1]++) 
// 循環4種運算符,1表示+,2表示-,3表示*,4表示  將0設置爲空不使用,是爲了可以利用同一個j進行操作數數組和運算符數組的遍歷。
		{
			if ((i[1] < 4) || (arr[2] != 0)) // 運算符若是/,則第二個運算數不能爲0,(注:“||”是或運算,兩個條件至少要有一個成立,即第一個運算符爲/時,第二個運算數不爲0)
			{
				for (i[2] = 1; i[2] <= 4; i[2]++) {
					if ((i[2] < 4) || (arr[3] != 0)) // 當第二個運算符爲/時,第三個運算數不爲0
					{
						for (i[3] = 1; i[3] <= 4; i[3]++) {
							if ((i[3] < 4) || (arr[4] != 0)) // 當第三個運算符爲/時,第四個運算數不爲0
							{
								for (i[4] = 1; i[4] <= 4; i[4]++) {
									if ((i[4] < 4) || (arr[5] != 0)) // 當第四個運算符爲/時,第五個運算數不爲0
									{

										// 主要運算步驟
										left = 0;
										right = arr[1];//取操作數的第一個
										sign = 1;//將char類型運算符數組對應轉化爲sgin
									// 使用case語句,將4種運算符填到對應的空格位置,並進行計算
										for (j = 1; j <= 4; j++) {
											switch (oper[i[j]]) {
											case '+':
											left = left + sign * right;//將計算結果變爲左
												sign = 1;
												right = arr[j + 1];//將操作數數組索引後移
												break;
											case '-':
												left = left + sign * right;
												sign = -1;
												right = arr[j + 1];
												break;
											case '*':
												right = right * arr[j + 1];
												break;
											case '/':
												right = right / arr[j + 1];
												break;
											}
										}

										result = arr[5];

										// 開始判斷,如果運算式子的結果和輸入的結果相同,則表示找到一種算法,並輸出這個解
										if (left + sign * right == result) {
											count++;

											for (j = 1; j <= 4; j++)
											System.out.print(arr[j] + "" + oper[i[j]]);
											System.out.print("=" + result);
											System.out.println();
											System.out.println(count + ":");
										}

									}
								}
							}

						}
					}
				}
			}
		}

	}

 

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