# 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`