#include<stdio.h> int main() { int a = 0; int b = 0; int c = 0; int d = 0; int e = 0; for (a = 1; a <= 5; a++) { for (b = 1; b <= 5; b++) { for (c = 1; c <= 5; c++) { for (d = 1; d <= 5; d++) { for (e = 1; e <= 5; e++) { if (((b == 1) + (a == 3) == 1) && ((b == 2) + (e == 4) == 1) && ((c == 1) + (d == 2) == 1) && ((c == 5) + (d == 3) == 1) && ((e == 4) + (a == 1) == 1)) { printf("A:第%d名 B:第%d名 C:第%d名 D:第%d名 E:第%d名\n",a,b,c,d,e); } } } } } } system("pause"); return 0; }
2、 日本某地發生了一件謀殺案,警察通過排查確定殺人凶手必為4個嫌疑犯的一個。以下為4個嫌疑犯的供詞。 A說:不是我。 B說:是C。 C說:是D。 D說:C在胡說 已知3個人說了真話,1個人說的是假話。 現在請根據這些信息,寫一個程序來確定到底誰是凶手。
#include<stdio.h> int main() { int kill = 0; for (kill = 'a'; kill <= 'd'; kill++) { if ((kill != 'a') + (kill == 'c') + (kill == 'd') + (kill != 'd') == 3) { printf("殺手是%c\n",kill); } } system("pause"); return 0; }
看完之後,才發現並沒有自己想的那麼復雜。總是重復糾結一些問題,導致沒有辦法去想整體的方法。下面我就簡單總結一下我解決這類實際問題的方法吧。 1、 讓C語言解決實際問題,其實它是特別笨的,它不能夠去分析邏輯找捷徑(或者說我們還不會用它找捷徑),所以 while 或 for 循環語句是必要的,它得把所有可能的情況一個一個列出來進行分析,看是否符合它的要求,再把符合要求的情況 printf 出來。 第一題,判斷五個人的排名,那麼輸出結果必然是五個人,每個人的名次可能是1-5,那麼就有25種情況,嵌套5個for循環語句可以實現這一功能。 第二題,需要判斷誰是killer,很明顯,程序只需要輸入killer是誰就可以,也就是一個人,而其他的人就必然是無關人。因此,有4個嫌疑人,就需要4次循環,每次假設某一個人為killer,一次循環就可以做到列出誰是killer的所有情況。(由於四個人是abcd,所以定義了int型變量,從'a'到‘d’,字符型在內存裡是以整型存儲的。) 2、列出所有情況之後就要對所有情況進行判斷, if 語句,判斷是否滿足條件。到了第二個難點,條件怎麼寫。 第一題,五個人,每個人說的都有一真一假,也就是說,一個人說兩句話只有一句是真話,“A選手說:B第一,我第三。”兩個條件分別是(b==1)(a==3),中間怎麼連接呢? &&:都為真,結果為1 ||:有一個為真結果就為1 而 !考慮多種可能的話程序又會很復雜。這裡用先+再判斷是否==1,(b==1)+(a==3)==1,兩個條件只有一個為真是結果為真,要求五個人說的話都滿足,所以五個語句之間用&&連接。只要用循環語句列出來的情況同時滿足五個人說的話(只有一句話是真話),則這種情況符合題意,直接輸出,然後再次判斷下一種情況。 第二題,四個人說的話只有三個人是真的,計算量相當於只有第一題的五分之一,只要判斷四個滿足三個條件,第四個不滿足就可以,而不用多個用&&再連接。 if ((kill != 'a') + (kill == 'c') + (kill == 'd') + (kill != 'd') == 3)四個人說的四種情況相加,結果等於三時,說明只滿足三個條件,第四個不滿足,當某一個嫌疑人是killer時 if 語句成立,則該嫌疑人確定為killer,輸出。