1. 程式人生 > >邏輯表達式——誰在撒謊

邏輯表達式——誰在撒謊

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。條件運算符的結合方向是從右至左。

四、運行結果

技術分享

邏輯表達式——誰在撒謊