# APCS實作題2017年10月第1題:邏輯運算子 (Logic Operators) > 第1版:2023年2月18日 > 第2版:2023年6月6日,加上 C++ 程式碼 > 作者:王一哲 > 題目來源:[106年10月28日實作題第1題](https://apcs.csie.ntnu.edu.tw/wp-content/uploads/2018/12/1061028APCSImplementation.pdf) > [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=c461) <br /> ## 題目 ### 問題描述 小蘇最近在學三種邏輯運算子 AND、OR 和 XOR。這三種運算子都是二元運算子,也就是說在運算時需要兩個運算元,例如 a AND b。對於整數 a 與 b,以下三個二元運算子的運算結果定義如下列三個表格: <img height="100%" width="100%" src="https://i.imgur.com/lKJwzR4.png" style="display: block; margin-left: auto; margin-right: auto;"/> <br /> 舉例來說: 1. 0 AND 0 的結果為 0,0 OR 0 以及 0 XOR 0 的結果也為 0。 2. 0 AND 3 的結果為 0,0 OR 3 以及 0 XOR 3 的結果則為 1。 3. 4 AND 9 的結果為 1,4 OR 9 的結果也為 1,但 4 XOR 9 的結果為 0。 請撰寫一個程式,讀入 a、b 以及邏輯運算的結果,輸出可能的邏輯運算為何。 <br /> ### 輸入格式 輸入只有一行,共三個整數值,整數間以一個空白隔開。第一個整數代表 a,第二個整數代表 b ,這兩數均為非負的整數。第三個整數代表邏輯運算的結果,只會是 0 或 1 。 <br /> ### 輸出格式 輸出可能得到指定結果的運算,若有多個,輸出順序為 AND、OR、XOR,每個可能的運算單獨輸出一行,每行結尾皆有換行。若不可能得到指定結果,輸出 IMPOSSIBLE。(注意輸出時所有英文字母均為大寫字母。) <br /> ### 範例一:輸入 ``` 0 0 0 ``` ### 範例一:正確輸出 ``` AND OR XOR ``` <br /> ### 範例二:輸入 ``` 1 1 1 ``` ### 範例二:正確輸出 ``` AND OR ``` <br /> ### 範例三:輸入 ``` 3 0 1 ``` ### 範例三:正確輸出 ``` OR XOR ``` <br /> ### 範例四:輸入 ``` 0 0 1 ``` ### 範例四:正確輸出 ``` IMPOSSIBLE ``` <br /> ### 評分說明 輸入包含若干筆測試資料,每一筆測試資料的執行時間限制(time limit)均為 1 秒,依正確通過測資筆數給分。其中: - 第 1 子題組 80 分,a 和 b 的值只會是 0 或 1。 - 第 2 子題組 20 分,0 ≤ a, b < 10,000。 <br /> ## C 語言程式碼 ```c= #include <stdio.h> int main() { int a, b, c; scanf("%d", &a); scanf("%d", &b); scanf("%d", &c); if(a > 0) a = 1; if(b > 0) b = 1; if((a & b) == c) printf("AND\n"); if((a | b) == c) printf("OR\n"); if((a ^ b) == c) printf("XOR\n"); if(((a & b) != c) & ((a | b) != c) & ((a ^ b) != c)) printf("IMPOSSIBLE\n"); return 0; } ``` <br /> 1. 解題關鍵:第8、9行,當a或b大於1時,先將a或b的值設定成1,這樣在做位元運算時才不會出錯。 2. 運算符號分別為:AND &,OR |,XOR ^。 3. 第14行:當第11、12、13行的條件都不成立時,印出 IMPOSSIBLE。 4. ZeroJudge 測試結果,花費時間為 2 ms,使用記憶體最多為 92 KB。 5. 由於這題比較單純,ZeroJudge 上許多人會試著用最少行的程式碼寫出答案。 <br /><br /> ## C++ 程式碼 ```cpp= #include <iostream> using namespace std; int main() { int a, b, c; cin >> a >> b >> c; if(a > 0) a = 1; if(b > 0) b = 1; if((a & b) == c) cout << "AND" << endl; if((a | b) == c) cout << "OR" << endl; if((a ^ b) == c) cout << "XOR" << endl; if(((a & b) != c) & ((a | b) != c) & ((a ^ b) != c)) cout << "IMPOSSIBLE" << endl; return 0; } ``` <br /> 1. 依據 C 語言的程式碼改寫成 C++ 語法。 2. ZeroJudge 測試結果,花費時間為 2 ms,使用記憶體為 324 KB。 <br /><br /> ## Python 程式碼 ```python= a, b, c = map(int, input().split()) if a > 0: a = 1 if b > 0: b = 1 if a & b == c: print("AND") if a | b == c: print("OR") if a ^ b == c: print("XOR") if (a & b != c) and (a | b != c) and (a ^ b != c): print("IMPOSSIBLE") ``` <br /> 1. 解題關鍵:第4、5行,當a或b大於1時,先將a或b的值設定成1,這樣在做位元運算時才不會出錯。 2. 運算符號分別為:AND &,OR |,XOR ^。 3. 第10行:當第7、8、9行的條件都不成立時,印出 IMPOSSIBLE。 4. ZeroJudge 測試結果,花費時間為 18 ms,使用記憶體為 3.3 MB。 5. 由於這題比較單純,ZeroJudge 上許多人會試著用最少行的程式碼寫出答案。 <br /><br /> --- ###### tags:`APCS`、`C`、`Python`