# 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`
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.