邏輯表達式——誰在撒謊
阿新 • • 發佈:2017-05-05
pan urn clas alt 賦值 窮舉法 mage main 算法
一、問題描述
三個嫌疑犯在法官面前各執一詞,
甲說:“乙在撒謊。”
乙說:“丙在撒謊。”
丙說:“甲乙兩個人都在撒謊。”
法官為難,甲乙丙三人到底誰在說謊,誰在說真話?
二、算法思想
三個人中每個人有兩種可能,要麽說真話,要麽說假話,因此通過窮舉法即可判斷出最終的結果。
假設甲乙丙三個人所說的話用變量a、b、c表示,0代表說假話,1代表說真話。根據題意,列出如下的邏輯表達式:
甲:(a&&!b) || (!a&&b)
乙:(b&&!c) || (!b&&c)
丙:(c&&a+b==0) || (!c&&a+b!=0)
具體的操作利用循環語句解決,設置多重循環依次窮舉出三人說真話和假話的所有可能。再利用條件語句進行判斷,其條件表達式為:
( (a&&!b) || (!a&&b) ) && ( (b&&!c) || (!b&&c) ) && ( (c&&a+b==0) || (!c&&a+b!=0) )
三、程序代碼
#include <stdio.h> int main(){ int a, b, c; for(a=0; a<=1; a++){for(b=0; b<=1; b++){ for(c=0; c<=1; c++){ if( ((a&&!b) || (!a&&b)) && ((b&&!c) || (!b&&c)) && ((c&&a+b==0) || (!c&&a+b!=0)) ){ printf("甲說的是%s。\n", a?"真話":"假話"); printf("乙說的是%s。\n", b?"真話":"假話"); printf("丙說的是%s。\n", c?"真話":"假話"); } } } } return 0; }
補充:條件運算符的優先級低於關系運算符和算術運算符,但高於賦值運算符。因此max=(a>b)?a:b,可以去掉括號寫為max=a>b?a:b。條件運算符的結合方向是從右至左。
四、運行結果
邏輯表達式——誰在撒謊