C语言实现小时候经常做的智力测试题
??????? 下面的是兩道面試題,小時候經常會看到這種類似的題目,但是用C語言實現,確實沒那么容易想到,尤其是對我這種接觸C語言僅僅一年的新人。
?????話不多說,?先上題...........
1、
5位運動員參加了10米臺跳水比賽,有人讓他們預測比賽結果
A選手說:B第一,我第三。
B選手說:我第二,E第四。
C選手說:我第一,D第二。
D選手說:C最后,我第三。
E選手說:我第四,A第一。
比賽結束后,每位選手都說對了一半,請編程確定比賽的名次。
?
?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,輸出。
轉載于:https://blog.51cto.com/whzhou/1722536
總結
以上是生活随笔為你收集整理的C语言实现小时候经常做的智力测试题的全部內容,希望文章能夠幫你解決所遇到的問題。