# C++ 基礎語法練習題:Unit-6 多維陣列、多重迴圈
講義不是我寫的,原文連結為 [Yui Huang 演算法學習筆記:C++ 基礎語法](https://yuihuang.com/syntax/)
我只是將自己寫的練習題程式碼記錄下來。
最後更新日期:2024年11月12日
## [ZeroJudge: a015. 矩陣的翻轉](https://zerojudge.tw/ShowProblem?problemid=a015)
### Python 程式碼
執行時間最久約為 17 ms,使用記憶體最多約為 3.3 MB,通過測試。
```python=
import sys
for line in sys.stdin:
m, n = map(int, line.split())
mat = [list(map(int, input().split())) for _ in range(m)]
for i in range(n):
for j in range(m):
print(mat[j][i], end="\n" if j == m-1 else " ")
```
### C++ 程式碼
執行時間最久約為 2 ms,使用記憶體最多約為 308 kB,通過測試。
```cpp=
#include <iostream>
using namespace std;
int main() {
int m, n;
while(cin >> m >> n) {
int mat[m][n];
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
cin >> mat[i][j];
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cout << mat[j][i] << " \n"[j == m-1];
}
return 0;
}
```
## [ZeroJudge: c085. 00350 - Pseudo-Random Numbers](https://zerojudge.tw/ShowProblem?problemid=c085)
### Python 程式碼
使用 collections.defaultdict 記錄每個數字出現的序號,當同一個數字出現第二次時,印出兩次序號的差即為答案,再中止迴圈。執行時間最久約為 38 ms,使用記憶體最多約為 6 MB,通過測試。
```python=
from collections import defaultdict
ca = 0
while True:
ca += 1
Z, I, M, L = map(int, input().split())
if Z == 0 and I == 0 and M == 0 and L == 0: break
cnt = defaultdict(list)
cnt[L].append(0)
idx = 0
while True:
idx += 1
L = (Z*L + I) % M
cnt[L].append(idx)
if len(cnt[L]) == 2:
print(f"Case {ca:d}: {cnt[L][1] - cnt[L][0]:d}")
break
```
### C++ 程式碼
執行時間最久約為 5 ms,使用記憶體最多約為 1.1 MB,通過測試。
```cpp=
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int ca = 0, Z, I, M, L, idx;
while(true) {
ca++;
cin >> Z >> I >> M >> L;
if (Z == 0 && I == 0 && M == 0 && L == 0) break;
unordered_map<int, vector<int>> cnt;
cnt[L].push_back(0);
idx = 0;
while(true) {
idx++;
L = (Z*L + I) % M;
cnt[L].push_back(idx);
if (cnt[L].size() == 2) {
cout << "Case " << ca << ": " << cnt[L][1] - cnt[L][0] << "\n";
break;
}
}
}
return 0;
}
```
## [ZeroJudge: d097. 10038 - Jolly Jumpers](https://zerojudge.tw/ShowProblem?problemid=d097)
因為 Jolly Jumpers 的定義是長度為 n 的數列,其相鄰兩個數字差的絕對值為 1 ~ n-1,所以 1 ~ n-1 每個值都要各有一個,只要有重複的值或是不在 1 ~ n-1 之間,就不是 Jolly Jumpers。
### Python 程式碼
執行時間最久約為 30 ms,使用記憶體最多約為 4 MB,通過測試。
```python=
import sys
for line in sys.stdin:
data = list(map(int, line.split()))
n = data[0]
arr = data[1:]
found = [False]*n # 差值 0 ~ n-1 是否有被找到,其中 0 是用不到的資料
flag = True # 是否為 Jolly Jumpers
for i in range(n-1): # 依序産生 0 ~ n-2
diff = abs(arr[i+1] - arr[i]) # 計算相鄰兩數的差絕對值
if diff < 1 or diff >= n or found[diff]: # 如果差值不在 1 ~ n-1 之間或是已被找到過
flag = False # 不是 Jolly Jumpers
break # 中止迴圈
else: found[diff] = True # 設定 diff 狀態為已找到
print("Jolly" if flag else "Not jolly")
```
### C++ 程式碼
執行時間最久約為 5 ms,使用記憶體最多約為 352 kB,通過測試。
```cpp=
#include <iostream>
#include <cmath>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n;
while(cin >> n) {
int arr[n], found[n] = {0}; // found 差值 0 ~ n-1 是否有被找到,其中 0 是用不到的資料
for(int i=0; i<n; i++) cin >> arr[i];
bool flag = true; // 是否為 Jolly Jumpers
for(int i=0; i<n-1; i++) { // 依序産生 0 ~ n-2
int diff = abs(arr[i+1] - arr[i]); // 計算相鄰兩數的差絕對值
if (diff < 1 || diff >= n || found[diff]) { // 如果差值不在 1 ~ n-1 之間或是已被找到過
flag = false; // 不是 Jolly Jumpers
break; // 中止迴圈
} else found[diff]++; // 設定 diff 狀態為已找到
}
cout << (flag ? "Jolly" : "Not jolly") << "\n";
}
return 0;
}
```
## [ZeroJudge: d123. 11063 - B2-Sequence](https://zerojudge.tw/ShowProblem?problemid=d123)
因為條件為 $b_i + b_j$ 皆不相等而且 $i \leq j$,要檢測 $i = j$ 的狀況。
### Python 程式碼
使用 set,執行時間最久約為 29 ms,使用記憶體最多約為 3.3 MB,通過測試。
```python=
import sys
ca = 0 # 第幾個測試的 case
for line in sys.stdin:
ca += 1 # ca 加 1
n = int(line)
arr = list(map(int, input().split()))
found = set() # 已被找到過的任意兩數加總
flag = True # 是否為 B2-Sequence
for i in range(n): # 依序産生 0 ~ n-1
if not flag: break # 如果已經確定不是 B2-Sequence,中止迴圈
for j in range(i, n): # 依序産生 i ~ n-1
isum = arr[i] + arr[j] # 計算任意兩數的加總
if isum in found: # 如果加總已被找到過
flag = False # 不是 B2-Sequence
break # 中止迴圈
else: found.add(isum) # isum 加入 found
print(f"Case #{ca:d}: It is ", end="")
print("a B2-Sequence.\n" if flag else "not a B2-Sequence.\n")
```
使用 collections.defaultdict,執行時間最久約為 33 ms,使用記憶體最多約為 3.7 MB,通過測試。
```python=
import sys
from collections import defaultdict
ca = 0 # 第幾個測試的 case
for line in sys.stdin:
ca += 1 # ca 加 1
n = int(line)
arr = list(map(int, input().split()))
found = defaultdict(bool) # 任意兩數加總是否有被找到過
flag = True # 是否為 B2-Sequence
for i in range(n): # 依序産生 0 ~ n-1
if not flag: break # 如果已經確定不是 B2-Sequence,中止迴圈
for j in range(i, n): # 依序産生 i ~ n-1
isum = arr[i] + arr[j] # 計算任意兩數的加總
if found[isum]: # 如果加總已被找到過
flag = False # 不是 B2-Sequence
break # 中止迴圈
else: found[isum] = True # 設定 isum 狀態為已找到
print(f"Case #{ca:d}: It is ", end="")
print("a B2-Sequence.\n" if flag else "not a B2-Sequence.\n")
```
### C++ 程式碼
使用 set,執行時間最久約為 4 ms,使用記憶體最多約為 324 kB,通過測試。
```cpp=
#include <iostream>
#include <set>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n, ca = 0; // # 第幾個測試的 case
while(cin >> n) {
ca++; // ca 加 1
int arr[n];
for(int i=0; i<n; i++) cin >> arr[i];
set<int> found; // 已被找到過的任意兩數加總
bool flag = true; // 是否為 B2-Sequence
for(int i=0; i<n; i++) { // 依序産生 0 ~ n-1
if (!flag) break; // 如果已經確定不是 B2-Sequence,中止迴圈
for(int j=i; j<n; j++) { // 依序産生 i ~ n-1
int isum = arr[i] + arr[j]; // 計算任意兩數的加總
if (found.count(isum) == 1) { // 如果加總已被找到過
flag = false; // 不是 B2-Sequence
break; // 中止迴圈
} else found.insert(isum); // isum 加入 found
}
}
cout << "Case #" << ca << ": It is ";
cout << (flag ? "a" : "not a") << " B2-Sequence.\n\n";
}
return 0;
}
```
使用 unordered_map,執行時間最久約為 4 ms,使用記憶體最多約為 364 kB,通過測試。
```cpp=
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n, ca = 0; // # 第幾個測試的 case
while(cin >> n) {
ca++; // ca 加 1
int arr[n];
for(int i=0; i<n; i++) cin >> arr[i];
unordered_map<int, bool> found; // 已被找到過的任意兩數加總
bool flag = true; // 是否為 B2-Sequence
for(int i=0; i<n; i++) { // 依序産生 0 ~ n-1
if (!flag) break; // 如果已經確定不是 B2-Sequence,中止迴圈
for(int j=i; j<n; j++) { // 依序産生 i ~ n-1
int isum = arr[i] + arr[j]; // 計算任意兩數的加總
if (found[isum]) { // 如果加總已被找到過
flag = false; // 不是 B2-Sequence
break; // 中止迴圈
} else found[isum] = true; // found[isum] 設定為 true
}
}
cout << "Case #" << ca << ": It is ";
cout << (flag ? "a" : "not a") << " B2-Sequence.\n\n";
}
return 0;
}
```
## [ZeroJudge: b130. NOIP2006 1.明明的随机数](https://zerojudge.tw/ShowProblem?problemid=b130)
### Python 程式碼
執行時間最久約為 18 ms,使用記憶體最多約為 3.3 MB,通過測試。
```python=
n = int(input())
ans = sorted(list(set(map(int, input().split()))))
print(len(ans))
print(*ans)
```
### C++ 程式碼
使用 set,因為 C++ 的 set 資料會由小到大排序,可以直接印出資料。執行時間最久約為 2 ms,使用記憶體最多約為 348 kB,通過測試。
```cpp=
#include <iostream>
#include <set>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n, m; cin >> n;
set<int> arr;
for(int i=0; i<n; i++) {
cin >> m;
arr.insert(m);
}
cout << arr.size() << "\n";
size_t idx = 0;
for(auto a : arr) {
cout << a << " \n"[idx == arr.size()-1];
idx++;
}
return 0;
}
```
## [ZeroJudge: d673. 11608 - No Problem](https://zerojudge.tw/ShowProblem?problemid=d673)
### Python 程式碼
執行時間最久約為 17 ms,使用記憶體最多約為 3.3 MB,通過測試。
```python=
ca = 0 # 第幾個測試資料
while True:
n = int(input()) # 目前有的題目數量
if n == -1: break # 如果讀到 -1 中止迴圈
ca += 1 # 編號加 1
print(f"Case {ca:d}:") # 印出 Case X:
stocks = list(map(int, input().split())) # 每個月産生的題目數量
used = list(map(int, input().split())) # 每個月用掉的題目數量
for i in range(12): # 依序檢查 12 個月
if n >= used[i]: # 如果目前的題目數量夠多
print("No problem! :D")
n = n - used[i] + stocks[i] # 更新題目數量,減去用掉的題數、加上産生的題目
else: # 如果目前的題目數量不夠多
print("No problem. :(")
n += stocks[i] # 更新題目數量,加上産生的題目
```
### C++ 程式碼
執行時間最久約為 2 ms,使用記憶體最多約為 344 kB,通過測試。
```cpp=
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int ca = 0; // 第幾個測試資料
while(true) {
int n; cin >> n; // 目前有的題目數量
if (n == -1) break; // 如果讀到 -1 中止迴圈
ca++; // 編號加 1
cout << "Case " << ca << ":\n"; // 印出 Case X:
int stocks[12], used[12]; // stocks 每個月産生的題目數量,used 每個月用掉的題目數量
for(int i=0; i<12; i++) cin >> stocks[i];
for(int i=0; i<12; i++) cin >> used[i];
for(int i=0; i<12; i++) { // 依序檢查 12 個月
if (n >= used[i]) { // 如果目前的題目數量夠多
cout << "No problem! :D\n";
n = n - used[i] + stocks[i]; // 更新題目數量,減去用掉的題數、加上産生的題目
} else { // 如果目前的題目數量不夠多
cout << "No problem. :(\n";
n += stocks[i]; // 更新題目數量,加上産生的題目
}
}
}
return 0;
}
```
## [ZeroJudge: c135. 00706 - LC-Display](https://zerojudge.tw/ShowProblem?problemid=c135)
### Python 程式碼
想法比較單純的寫法,將每個數字要印出的資料都寫在自訂函式中,先産生所有要印出的資料最後再印出。執行時間最久約為 20 ms,使用記憶體最多約為 3.7 MB,通過測試。
```python=
def myfunc(num, s):
if num == 0: return zero(s)
elif num == 1: return one(s)
elif num == 2: return two(s)
elif num == 3: return three(s)
elif num == 4: return four(s)
elif num == 5: return five(s)
elif num == 6: return six(s)
elif num == 7: return seven(s)
elif num == 8: return eight(s)
elif num == 9: return nine(s)
def zero(s):
dis = [" " + "-"*s + " "]
for _ in range(s): dis.append("|" + " "*s + "|")
dis.append(" "*(s+2))
for _ in range(s): dis.append("|" + " "*s + "|")
dis.append(" " + "-"*s + " ")
return dis
def one(s):
dis = [" "*(s+2)]
for _ in range(s): dis.append(" "*(s+1) + "|")
dis.append(" "*(s+2))
for _ in range(s): dis.append(" "*(s+1) + "|")
dis.append(" "*(s+2))
return dis
def two(s):
dis = [" " + "-"*s + " "]
for _ in range(s): dis.append(" "*(s+1) + "|")
dis.append(" " + "-"*s + " ")
for _ in range(s): dis.append("|" + " "*(s+1))
dis.append(" " + "-"*s + " ")
return dis
def three(s):
dis = [" " + "-"*s + " "]
for _ in range(s): dis.append(" "*(s+1) + "|")
dis.append(" " + "-"*s + " ")
for _ in range(s): dis.append(" "*(s+1) + "|")
dis.append(" " + "-"*s + " ")
return dis
def four(s):
dis = [" "*(s+2)]
for _ in range(s): dis.append("|" + " "*s + "|")
dis.append(" " + "-"*s + " ")
for _ in range(s): dis.append(" "*(s+1) + "|")
dis.append(" "*(s+2))
return dis
def five(s):
dis = [" " + "-"*s + " "]
for _ in range(s): dis.append("|" + " "*(s+1))
dis.append(" " + "-"*s + " ")
for _ in range(s): dis.append(" "*(s+1) + "|")
dis.append(" " + "-"*s + " ")
return dis
def six(s):
dis = [" " + "-"*s + " "]
for _ in range(s): dis.append("|" + " "*(s+1))
dis.append(" " + "-"*s + " ")
for _ in range(s): dis.append("|" + " "*s + "|")
dis.append(" " + "-"*s + " ")
return dis
def seven(s):
dis = [" " + "-"*s + " "]
for _ in range(s): dis.append(" "*(s+1) + "|")
dis.append(" "*(s+2))
for _ in range(s): dis.append(" "*(s+1) + "|")
dis.append(" "*(s+2))
return dis
def eight(s):
dis = [" " + "-"*s + " "]
for _ in range(s): dis.append("|" + " "*s + "|")
dis.append(" " + "-"*s + " ")
for _ in range(s): dis.append("|" + " "*s + "|")
dis.append(" " + "-"*s + " ")
return dis
def nine(s):
dis = [" " + "-"*s + " "]
for _ in range(s): dis.append("|" + " "*s + "|")
dis.append(" " + "-"*s + " ")
for _ in range(s): dis.append(" "*(s+1) + "|")
dis.append(" " + "-"*s + " ")
return dis
while True:
s, n = input().split()
if s == "0" and n == "0": break
s = int(s); m = len(n)
output = []
for c in n: output.append(myfunc(int(c), s))
for i in range(2*s+3):
for j in range(m):
print(output[j][i], end="\n" if j == m-1 else " ")
print()
```
只有5種不同的輸出筆畫,將對應的筆畫寫在自訂函式中。分成5個區段輸出,依序讀取要印出的數字,根據數字選擇對應的筆畫。執行時間最久約為 18 ms,使用記憶體最多約為 3.5 MB,通過測試。
```python=
def bar(s):
print(" " + "-"*s + " ", end="")
def left(s):
print("|" + " "*(s+1), end="")
def right(s):
print(" "*(s+1) + "|", end="")
def space(s):
print(" "*(s+2), end="")
def both(s):
print("|" + " "*s + "|", end="")
while True:
s, n = input().split()
if s == "0" and n == "0": break
s = int(s)
m = len(n)
for i in range(m):
if n[i] in "14": space(s)
else: bar(s)
print(end="\n" if i == m-1 else " ")
for i in range(s):
for j in range(m):
if n[j] in "0489": both(s)
elif n[j] in "56": left(s)
else: right(s)
print(end="\n" if j == m-1 else " ")
for i in range(m):
if n[i] in "017": space(s)
else: bar(s)
print(end="\n" if i == m-1 else " ")
for i in range(s):
for j in range(m):
if n[j] in "068": both(s)
elif n[j] in "2": left(s)
else: right(s)
print(end="\n" if j == m-1 else " ")
for i in range(m):
if n[i] in "147": space(s)
else: bar(s)
print(end="\n" if i == m-1 else " ")
```
### C++ 程式碼
依照 Python 程式碼寫法2改寫而成,執行時間最久約為 2 ms,使用記憶體最多約為 316 kB,通過測試。
```cpp=
#include <iostream>
#include <string>
using namespace std;
void bar(int s) {
cout << " ";
for(int i=0; i<s; i++) cout << "-";
cout << " ";
}
void left(int s) {
cout << "|";
for(int i=0; i<s+1; i++) cout << " ";
}
void right(int s) {
for(int i=0; i<s+1; i++) cout << " ";
cout << "|";
}
void space(int s) {
for(int i=0; i<s+2; i++) cout << " ";
}
void both(int s) {
cout << "|";
for(int i=0; i<s; i++) cout << " ";
cout << "|";
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
while(true) {
string w, n; cin >> w >> n;
if (w == "0" && n == "0") break;
int s = stoi(w), m = (int)n.size();
for(int i=0; i<m; i++) {
char c = n[i];
if (c == '1' || c == '4') space(s);
else bar(s);
cout << " \n"[i == m-1];
}
for(int i=0; i<s; i++) {
for(int j=0; j<m; j++) {
char c = n[j];
if (c == '0' || c == '4' || c == '8' || c == '9') both(s);
else if (c == '5' || c == '6') left(s);
else right(s);
cout << " \n"[j == m-1];
}
}
for(int i=0; i<m; i++) {
char c = n[i];
if (c == '0' || c == '1' || c == '7') space(s);
else bar(s);
cout << " \n"[i == m-1];
}
for(int i=0; i<s; i++) {
for(int j=0; j<m; j++) {
char c = n[j];
if (c == '0' || c == '6' || c == '8') both(s);
else if (c == '2') left(s);
else right(s);
cout << " \n"[j == m-1];
}
}
for(int i=0; i<m; i++) {
char c = n[i];
if (c == '1' || c == '4' || c == '7') space(s);
else bar(s);
cout << " \n"[i == m-1];
}
}
return 0;
}
```
## [ZeroJudge: b367. 翻轉世界](https://zerojudge.tw/ShowProblem?problemid=b367)
### Python 程式碼
用二維串列,執行時間最久約為 18 ms,使用記憶體最多約為 3.3 MB,通過測試。
```python=
T = int(input())
for _ in range(T):
N, M = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(N)]
flag = True
for i in range(N//2): # 依序檢查第 i 及 -(i+1) 項
if mat[i] != mat[-(i+1)][::-1]: # 使用 [::-1] 將串列反序
flag = False
break
if flag and N%2 == 1: # 如果 flag 為 True 且 N 為奇數
if mat[N//2] != mat[N//2][::-1]: # 檢查正中央的串列反序後是否不同
flag = False
print("go forward" if flag else "keep defending")
```
將資料頭尾相接存成一維串列,依序檢查第i項及第-(i+1)項,只要這兩項不相等就中止迴圈,印出 keep defending;如果檢查到中央時仍然相等,印出 go forward。執行時間最久約為 18 ms,使用記憶體最多約為 3.3 MB,通過測試。
```python=
T = int(input())
for _ in range(T):
N, M = map(int, input().split())
mat = []
for _ in range(N): mat += list(map(int, input().split())) # 接成一維串列
flag = True
for i in range(N*M//2): # 依序檢查第 i 及 -(i+1) 項
if mat[i] != mat[-(i+1)]:
flag = False
break
print("go forward" if flag else "keep defending")
```
### C++ 程式碼
使用二維 vector,因為一維 vector 才能整個拿來比較是否相等,一維 array 不行。執行時間最久約為 2 ms,使用記憶體最多約為 344 kB,通過測試。
```cpp=
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int T; cin >> T;
for(int i=0; i<T; i++) {
int N, M; cin >> N >> M;
vector<vector<int>> mat (N, vector<int> (M));
for(int i=0; i<N; i++)
for(int j=0; j<M; j++)
cin >> mat[i][j];
bool flag = true;
for(int i=0; i<N/2; i++) { // 依序檢查第 i 及 N-i-1 項
vector<int> tmp (mat[N-i-1].begin(), mat[N-i-1].end()); // 複製資料
reverse(tmp.begin(), tmp.end()); // 反序
if (mat[i] != tmp) { // 如果不相等
flag = false;
break;
}
}
if (flag && N%2 == 1) { // 如果 flag 為 true 且 N 為奇數
vector<int> tmp (mat[N/2].begin(), mat[N/2].end()); // 複製資料
reverse(tmp.begin(), tmp.end()); // 反序
if (mat[N/2] != tmp) flag = false; // 檢查正中央的串列反序後是否不同
}
cout << (flag ? "go forward\n" : "keep defending\n");
}
return 0;
}
```
寫法2,執行時間最久約為 2 ms,使用記憶體最多約為 360 kB,通過測試。
```cpp=
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int T; cin >> T;
for(int i=0; i<T; i++) {
int N, M; cin >> N >> M;
int mat[N*M];
for(int i=0; i<N; i++)
for(int j=0; j<M; j++)
cin >> mat[i*M+j];
bool flag = true;
for(int i=0; i<N*M/2; i++) { // 依序檢查第 i 及 N*M-i-1 項
if (mat[i] != mat[N*M-i-1]) {
flag = false;
break;
}
}
cout << (flag ? "go forward\n" : "keep defending\n");
}
return 0;
}
```
## [ZeroJudge: c013. 00488 - Triangle Wave](https://zerojudge.tw/ShowProblem?problemid=c013)
### Python 程式碼
執行時間最久約為 19 ms,使用記憶體最多約為 3.3 MB,通過測試。
```python=
import sys
for line in sys.stdin:
n = int(line)
_ = input()
for _ in range(n):
A = int(input())
F = int(input())
for _ in range(F):
for i in range(1, A+1): print(str(i)*i)
for i in range(A-1, 0, -1): print(str(i)*i)
print()
```
### C++ 程式碼
執行時間最久約為 2 ms,使用記憶體最多約為 320 kB,通過測試。
```cpp=
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n;
while(cin >> n) {
for(int i=0; i<n; i++) {
int A, F; cin >> A >> F;
for(int j=0; j<F; j++) {
for(int k=1; k<=A; k++)
for(int m=0; m<k; m++)
cout << k << (m == k-1 ? "\n" : "");
for(int k=A-1; k>=1; k--)
for(int m=0; m<k; m++)
cout << k << (m == k-1 ? "\n" : "");
cout << "\n";
}
}
}
return 0;
}
```
## [ZeroJudge: a040. 阿姆斯壯數](https://zerojudge.tw/ShowProblem?problemid=a040)
### Python 程式碼
執行時間最久約為 0.4 s,使用記憶體最多約為 3.3 MB,通過測試。
```python=
from math import log10
n, m = map(int, input().split())
ans = []
for i in range(n, m+1):
p = int(log10(i)) + 1 # 計算 i 的位數
tot = 0 # 加總
num = i # 儲存目前要檢測的值
while num > 0: # 如果 num 大於 0 繼續執行
d = num%10 # 取目前的最後一位
tot += d**p # 計算 d**p
num //= 10 # 刪除最後一位
if tot == i: ans.append(i) # 如果 tot 等於 i,i 加入 ans
if len(ans) == 0: print("none") # 如果 ans 沒有資料,印出 none
else: print(*ans) # 否則印出 ans 的內容
```
### C++ 程式碼
執行時間最久約為 31 ms,使用記憶體最多約為 356 kB,通過測試。
```cpp=
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int n, m; cin >> n >> m;
vector<int> ans;
for(int i=n; i<=m; i++) {
int p = int(log10(i)) + 1; // 計算 i 的位數
int tot = 0, num = i; // tot 加總,num 儲存目前要檢測的值
while(num > 0) { // 如果 num 大於 0 繼續執行
int d = num%10; // 取目前的最後一位
tot += int(pow(d, p)); // 計算 d**p
num /= 10; // 刪除最後一位
}
if (tot == i) ans.push_back(i); // 如果 tot 等於 i,i 加入 ans
}
if (ans.empty()) cout << "none\n"; // 如果 ans 沒有資料,印出 none
else // 否則印出 ans 的內容
for(int i=0; i<(int)ans.size(); i++)
cout << ans[i] << " \n"[i == (int)ans.size()-1];
return 0;
}
```
## [ZeroJudge: a693. 吞食天地](https://zerojudge.tw/ShowProblem?problemid=a693)
### Python 程式碼
執行時間最久約為 1.2 s,使用記憶體最多約為 11.7 MB,通過測試。
```python=
import sys
for line in sys.stdin:
n, m = map(int, line.split())
psum = [0] + list(map(int, input().split()))
for i in range(1, n+1): psum[i] += psum[i-1]
for _ in range(m):
le, ri = map(int, input().split())
print(psum[ri] - psum[le-1])
```
### C++ 程式碼
執行時間最久約為 0.6 s,使用記憶體最多約為 552 kB,通過測試。
```cpp=
#include <iostream>
using namespace std;
int main() {
int n, m;
while(cin >> n >> m) {
int psum[n+1] = {0};
for(int i=1; i<=n; i++) {
cin >> psum[i];
psum[i] += psum[i-1];
}
for(int i=0; i<m; i++) {
int le, ri; cin >> le >> ri;
cout << psum[ri] - psum[le-1] << "\n";
}
}
return 0;
}
```
---
###### tags:`演算法`、`APCS`、`Python`、`C++`