---
# System prepended metadata

title: 0-4 條件判斷與基礎邏輯
tags: [演算法, C++, APCS, Python]

---

# 0-4 條件判斷與基礎邏輯

講義不是我寫的，網址在此 https://emanlaicepsa.github.io/2020/10/21/0-index/
我只是將自己寫的練習題程式碼記錄下來。
最後更新日期：2024年10月5日

## [TOJ: 94 / 判斷季節](https://toj.tfcis.org/oj/pro/94/)

### Python 程式碼

寫法1，用 if else 判斷季節。執行時間最久約為 26 ms，使用記憶體最多約為 4232 kB，通過測試。
```python=
month = int(input())
if 3 <= month <= 5: print("Spring!")
elif 6 <= month <= 8: print("Summer!")
elif 9 <= month <= 11: print("Autumn!")
else: print("Winter!")
```

寫法2，將用份對應的季節存入 tuple，由於索引值由0開始，開頭放入空字串，讀取輸入的月份轉成整數，印出對應的季節。寫法2看起來有點笨，但其實在某些狀況下很好用。執行時間最久約為 26 ms，使用記憶體最多約為 4116 kB，通過測試。
```python=
season = ("", "Winter!", "Winter!", "Spring!",
              "Spring!", "Spring!", "Summer!",
              "Summer!", "Summer!", "Autumn!",
              "Autumn!", "Autumn!", "Winter!")
print(season[int(input())])
```

### C++ 程式碼

寫法1，用 if else 判斷季節。執行時間最久約為 1 ms，使用記憶體最多約為 360 kB，通過測試。
```cpp=
#include <iostream>
using namespace std;

int main() {
    int month; cin >> month;
    if (month >= 3 && month <= 5) cout << "Spring!\n";
    else if (month >= 6 && month <= 8) cout << "Summer!\n";
    else if (month >= 9 && month <= 11) cout << "Autumn!\n";
    else cout << "Winter!\n";
    return 0;
}
```

寫法2，將用份對應的季節存入陣列。執行時間最久約為 1 ms，使用記憶體最多約為 284 kB，通過測試。
```cpp=
#include <iostream>
#include <string>
using namespace std;

int main() {
    string season[13] = {"", "Winter!", "Winter!", "Spring!",
                             "Spring!", "Spring!", "Summer!",
                             "Summer!", "Summer!", "Autumn!",
                             "Autumn!", "Autumn!", "Winter!"};
    int month; cin >> month;
    cout << season[month] << "\n";
    return 0;
}
```

## [TOJ: 95 / 體育期末考](https://toj.tfcis.org/oj/pro/95/)

### Python 程式碼

寫法1，使用多層的 if ... else，執行時間最久約為 39 ms，使用記憶體最多約為 4088 kB，通過測試。
```python=
a, b = map(int, input().split())
if a == 1:
    if b >= 8: print("PASS!")
    else: print("FAIL! You see see you!")
elif a == 2:
    if b >= 9: print("PASS!")
    else: print("FAIL! You see see you!")
else:
    if b >= 10: print("PASS!")
    else: print("FAIL! You see see you!")
```

也可以改成這樣，執行時間最久約為 19 ms，使用記憶體最多約為 4088 kB，通過測試。
```python=
a, b = map(int, input().split())
if a == 1 and b >= 8: print("PASS!")
elif a == 2 and b >= 9: print("PASS!")
elif a == 3 and b >= 10: print("PASS!")
else: print("FAIL! You see see you!")
```

改用 tuple 儲存各年級對應的及格標準，執行時間最久約為 25 ms，使用記憶體最多約為 4372 kB，通過測試。
```python=
s = (0, 8, 9, 10)
a, b = map(int, input().split())
if b >= s[a]: print("PASS!")
else: print("FAIL! You see see you!")
```

### C++ 程式碼

寫法1，使用多層的 if ... else，執行時間最久約為 1 ms，使用記憶體最多約為 128 kB，通過測試。
```cpp=
#include <iostream>
using namespace std;

int main() {
    int a, b; cin >> a >> b;
    if (a == 1) {
        if (b >= 8) cout << "PASS!\n";
        else cout << "FAIL! You see see you!\n";
    } else if (a == 2) {
        if (b >= 9) cout << "PASS!\n";
        else cout << "FAIL! You see see you!\n";
    } else {
        if (b >= 10) cout << "PASS!\n";
        else cout << "FAIL! You see see you!\n";
    }
    return 0;
}
```

也可以改成這樣，執行時間最久約為 1 ms，使用記憶體最多約為 128 kB，通過測試。
```cpp=
#include <iostream>
using namespace std;

int main() {
    int a, b; cin >> a >> b;
    if (a == 1 &&b >= 8) cout << "PASS!\n";
    else if (a == 2 && b >= 9) cout << "PASS!\n";
    else if (a == 3 && b >= 10) cout << "PASS!\n";
    else cout << "FAIL! You see see you!\n";
    return 0;
}
```

改用陣列儲存各年級對應的及格標準，執行時間最久約為 1 ms，使用記憶體最多約為 532 kB，通過測試。
```cpp=
#include <iostream>
using namespace std;

int main() {
    int s[4] = {0, 8, 9, 10};
    int a, b; cin >> a >> b;
    if (b >= s[a]) cout << "PASS!\n";
    else cout << "FAIL! You see see you!\n";
    return 0;
}
```

## [TOJ: 96 / a - Arithmetic](https://toj.tfcis.org/oj/pro/96/)

### Python 程式碼

執行時間最久約為 21 ms，使用記憶體最多約為 4028 kB，通過測試。
```python=
line = input().split()
a = int(line[0])
b = int(line[2])
op = line[1]
if op == '+':
    print(f"{a:d} + {b:d} = {a+b:d}")
elif op == '-':
    print(f"{a:d} - {b:d} = {a-b:d}")
elif op == '*':
    print(f"{a:d} * {b:d} = {a*b:d}")
elif op == '/':
    if b == 0: print("ERROR")
    else:
        print(f"{a:d} / {b:d} = {a//b:d} ... {a%b:d}")
```

### C++ 程式碼

寫法1，使用 if else。執行時間最久約為 1 ms，使用記憶體最多約為 340 kB，通過測試。
```cpp=
#include <iostream>
using namespace std;

int main() {
    int a, b; char op;
    cin >> a >> op >> b;
    if (op == '+')
        cout << a << " + " << b << " = " << a+b << "\n";
    else if (op == '-')
        cout << a << " - " << b << " = " << a-b << "\n";
    else if (op == '*')
        cout << a << " * " << b << " = " << a*b << "\n";
    else if (op == '/') {
        if (b == 0) cout << "ERROR\n";
        else cout << a << " / " << b << " = " << a/b << " ... " << a%b << "\n";
    }
    return 0;
}
```

寫法2，使用 case。執行時間最久約為 1 ms，使用記憶體最多約為 284 kB，通過測試。
```cpp=
#include <iostream>
using namespace std;

int main() {
    int a, b; char op;
    cin >> a >> op >> b;
    switch(op) {
        case '+':
            cout << a << " + " << b << " = " << a+b << "\n";
            break;
        case '-':
            cout << a << " - " << b << " = " << a-b << "\n";
            break;
        case '*':
            cout << a << " * " << b << " = " << a*b << "\n";
            break;
        case '/':  // 因為題目限制操作只有 +-*/ 等4種，這行可以改成 default:
            if (b == 0) cout << "ERROR\n";
            else cout << a << " / " << b << " = " << a/b << " ... " << a%b << "\n";
            //break;  // 最後一項可以不加 break
    }
    return 0;
}
```

## [TOJ: 102 / f - Floating Point](https://toj.tfcis.org/oj/pro/102/)

### Python 程式碼

執行時間最久約為 129 ms，使用記憶體最多約為 4208 kB，通過測試。
```python=
line = input().split()
a = float(line[0])
b = float(line[2])
op = line[1]
if op == '+':
    print(f"{a:.4f} + {b:.4f} = {a+b:.4f}")
elif op == '-':
    print(f"{a:.4f} - {b:.4f} = {a-b:.4f}")
elif op == '*':
    print(f"{a:.4f} * {b:.4f} = {a*b:.4f}")
elif op == '/':
    if b == 0: print("ERROR")
    else:
        print(f"{a:.4f} / {b:.4f} = {a/b:.4f}")
```

### C++ 程式碼

寫法1，用 iomanip 函式庫的 setprecision 及 fixed 設定並固定輸出的小數位數。注意，**浮點數要用 double 才能過關**，用 float 無法通過其中兩筆測資。執行時間最久約為 4 ms，使用記憶體最多約為 532 kB，通過測試。
```cpp=
#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    double a, b; char op;
    cin >> a >> op >> b;
    cout << fixed << setprecision(4);
    switch(op) {
        case '+':
            cout << a << " + " << b << " = " << a+b << "\n";
            break;
        case '-':
            cout << a << " - " << b << " = " << a-b << "\n";
            break;
        case '*':
            cout << a << " * " << b << " = " << a*b << "\n";
            break;
        case '/':
            if (b == 0) {
                cout << "ERROR\n";
                return 0;
            } else cout << a << " / " << b << " = " << a/b << "\n";
            break;
    }
    return 0;
}
```

寫法2，改用 stdio.h 函式庫的 scanf 讀取資料，用 printf 輸出資料。注意，**浮點數要用 double 才能過關**，用 float 無法通過其中兩筆測資。執行時間最久約為 2 ms，使用記憶體最多約為 316 kB，通過測試。
```cpp=
#include <stdio.h>
using namespace std;

int main() {
    double a, b; char op;
    scanf("%lf %c %lf", &a, &op, &b);
    switch(op) {
        case '+':
            printf("%.4f + %.4f = %.4f\n", a, b, a+b);
            break;
        case '-':
            printf("%.4f - %.4f = %.4f\n", a, b, a-b);
            break;
        case '*':
            printf("%.4f * %.4f = %.4f\n", a, b, a*b);
            break;
        case '/':
            if (b == 0) printf("ERROR\n");
            else printf("%.4f / %.4f = %.4f\n", a, b, a/b);
            break;
    }
    return 0;
}
```

## [TOJ: 103 / Is it good to drink](https://toj.tfcis.org/oj/pro/103/)

### Python 程式碼

執行時間最久約為 33 ms，使用記憶體最多約為 4120 kB，通過測試。
```python=
line1 = input().split()
n1 = line1[0]
s1 = int(line1[1])
line2 = input().split()
n2 = line2[0]
s2 = int(line2[1])
if n1 == n2 and s1 == s2: print("GOOD")
elif n1 == n2 or s1 == s2: print("=~=")
else: print("OTZ")
```

### C++ 程式碼

執行時間最久約為 1 ms，使用記憶體最多約為 304 kB，通過測試。
```cpp=
#include <iostream>
#include <string>
using namespace std;

int main() {
    string n1, s1, n2, s2;
    cin >> n1 >> s1 >> n2 >> s2;
    if (n1 == n2 && s1 == s2) cout << "GOOD\n";
    else if (n1 == n2 || s1 == s2) cout << "=~=\n";
    else cout << "OTZ\n";
    return 0;
}
```

## [TOJ: 535 / 3-9.電玩技能綜合檢定](https://toj.tfcis.org/oj/pro/535/)

### Python 程式碼

執行時間最久約為 47 ms，使用記憶體最多約為 4384 kB，通過測試。
```python=
s = int(input())
if s == 100: print("S")
elif 90 <= s <= 99: print("A")
elif 80 <= s <= 89: print("B")
elif 70 <= s <= 79: print("C")
elif 60 <= s <= 69: print("D")
else: print("F")
```

### C++ 程式碼

執行時間最久約為 3 ms，使用記憶體最多約為 532 kB，通過測試。
```cpp=
#include <iostream>
using namespace std;

int main() {
    int s; cin >> s;
    if (s == 100) cout << "S\n";
    else if (s >= 90 && s <= 99) cout << "A\n";
    else if (s >= 80 && s <= 89) cout << "B\n";
    else if (s >= 70 && s <= 79) cout << "C\n";
    else if (s >= 60 && s <= 69) cout << "D\n";
    else cout << "F\n";
    return 0;
}
```

## [TOJ: 538 / A. 二階](https://toj.tfcis.org/oj/pro/538/)

### Python 程式碼

執行時間最久約為 86 ms，使用記憶體最多約為 4348 kB，通過測試。
```python=
english, math, nature = map(int, input().split())
data, program = map(float, input().split())
threshold = float(input())
score = 20.0*(english*1.25 + math*2.0 + nature*1.0)/(15.0*4.25)\
        + data*0.4 + program*0.4
if score >= threshold: print("YA")
else: print("QQ")
```

### C++ 程式碼

執行時間最久約為 6 ms，使用記憶體最多約為 616 kB，通過測試。
```cpp=
#include <iostream>
using namespace std;

int main() {
    int english, math, nature;
    cin >> english >> math >> nature;
    float data, program, threshold, score;
    cin >> data >> program >> threshold;
    score = 20.0*((float)english*1.25 + (float)math*2.0 + (float)nature*1.0)/(15.0*4.25)
            + data*0.4 + program*0.4;
    cout << (score >= threshold ? "YA" : "QQ") << "\n"; 
    //if (score >= threshold) cout << "YA\n";
    //else cout << "QQ\n";
    return 0;
}
```

## [TOJ: 461 / A. 海綿寶寶的時鐘](https://toj.tfcis.org/oj/pro/461/)

### Python 程式碼

寫法1，真的計算時針、分針夾角，執行時間最久約為 31 ms，使用記憶體最多約為 4372 kB，通過測試。
```python=
x = float(input())
if x > 180.0: x = 360.0 - x
x *= 10.0
ans = 0
dh, dm = 0, 0

for h in range(12):
    for m in range(60):
        diff = abs(dm - dh)
        if diff > 1800: diff = 3600 - diff
        if diff == int(x): ans += 1
        dh += 5
        dm += 60
        if dh >= 3600: dh -= 3600
        if dm >= 3600: dm -= 3600
        
ans *= 2
print(ans)
```

寫法2，因為時針、分針夾角為 $0^{\circ}$ 只有兩種可能性，就是 00:00 及 12:00；如果夾角為 $180^{\circ}$ 只有兩種可能性，就是 06:00 及 18:00；其它夾角在一天中都會出現 4 次，如果知道這個性質程式碼會簡化很多。執行時間最久約為 19 ms，使用記憶體最多約為 3960 kB，通過測試。
```python=
x = float(input())
if x == 0 or x == 180: print(2)
else: print(4)
```

### C++ 程式碼

寫法1，真的計算時針、分針夾角，執行時間最久約為 3 ms，使用記憶體最多約為 536 kB，通過測試。
```cpp=
#include<iostream>
#include<cmath>
using namespace std;

int main() {
    float x; cin >> x;
    if (x > 180.0) x = 360.0 - x;
    x *= 10.0;
    int ans = 0, dh = 0, dm = 0;
    for(int h=0; h<12; h++) {
        for(int m=0; m<60; m++) {
            int diff = abs(dm - dh);
            if (diff > 1800) diff = 3600 - diff;
            if (diff == int(x)) ans++;
            dh += 5;
            dm += 60;
            if (dh >= 3600) dh -= 3600;
            if (dm >= 3600) dm -= 3600;
        }
    }
    ans *= 2;
    cout << ans << "\n";
    return 0;
}
```

寫法2，因為時針、分針夾角為 $0^{\circ}$ 只有兩種可能性，就是 00:00 及 12:00；如果夾角為 $180^{\circ}$ 只有兩種可能性，就是 06:00 及 18:00；其它夾角在一天中都會出現 4 次，如果知道這個性質程式碼會簡化很多。執行時間最久約為  ms，使用記憶體最多約為 128 kB，通過測試。
```cpp=
#include<iostream>
using namespace std;

int main() {
    float x; cin >> x;
    if (x == 0 || x == 180) cout << 2 << "\n";
    else cout << 4 << "\n";
    return 0;
}
```

## [ZeroJudge: f312. 1. 人力分配](https://zerojudge.tw/ShowProblem?problemid=f312)

{%hackmd @yizhewang/ryV42h5A3 %}

------

###### tags:`演算法`、`APCS`、`Python`、`C++`