日期:2025年9月11日
ZeroJudge 題目連結:d681. BinaryCount
解題想法
每次讀取一行字串,直到 EOF 為止。將字串用空格分割,如果分割後的字串為 s,在 Python 可以用 int(s, 2) 轉換成 int,在 C++ 可以用 bitset。先儲存首項的數值,接下來一次讀取一個運算符號及整數,依照運算符號計算數值,同時組合要輸出的運算式。
Python 程式碼
使用時間約為 0.1 s,記憶體約為 3.6 MB,通過測試。
import sys
for line in sys.stdin:
arr = list(line.split()) # 分割讀到的字串
equ = [arr[0]] # 要輸出的算式,先放入 arr[0]
last = int(arr[0], 2) # 前一個計算結果,先放入 arr[0] 用 2 進位換算的整數
n = len(arr) # arr 的長度
for i in range(1, n, 2): # 依序處理 arr[1], arr[2] ~ arr[n-2], arr[n-1]
op = arr[i] # 運算符號
if op == "and": # 如果是 and
equ.append("&&") # 將 && 加入 equ
last = last & int(arr[i+1], 2) # 將 last 與 arr[i+1] 用 2 進位換算的整數取 &
elif op == "or": # 如果是 or
equ.append("||") # 將 || 加入 equ
last = last | int(arr[i+1], 2) # 將 last 與 arr[i+1] 用 2 進位換算的整數取 |
equ.append(arr[i+1]) # 將 arr[i+1] 加入 equ
print("".join(equ) + " = " + bin(last)[2:].zfill(5)) # 拼成要輸出的算式,計算結果要補 0
C++ 程式碼
使用時間約為 39 ms,記憶體約為 1.9 MB,通過測試。
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <bitset>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
string s, equ; stringstream ss; // 暫存資料用的字串 s,要輸出的算式 equ
vector<string> arr; // 分割後的字串
while(getline(cin, s)) {
ss.clear(); arr.clear(); equ.clear(); // 清空所有容器
ss << s; // s 傳進 ss
while(ss >> s) arr.push_back(s); // 將 ss 的資料傳給 s,再加到 arr 之中
equ += arr[0]; // 要輸出的算式,先加入 arr[0]
bitset<5> last (arr[0]); // 5 位元的 bitset,前一個計算結果,先放入 arr[0]
int n = (int)arr.size(); // arr 的長度
for(int i=1; i<n; i+=2) { // 依序處理 arr[1], arr[2] ~ arr[n-2], arr[n-1]
string op = arr[i]; // 運算符號
bitset<5> now (arr[i+1]); // 5 位元的 bitset,arr[i+1]
if (op == "and") { // 如果是 and
equ += "&&"; // 將 && 加入 equ
last = last & now; // last 與 now 取 &
} else if (op == "or") { // 如果是 or
equ += "||"; // 將 || 加入 equ
last = last | now; // last 與 now 取 |
}
equ += arr[i+1]; // 將 arr[i+1] 加入 equ
}
cout << equ << " = " << last.to_string() << "\n"; // 拼成要輸出的算式
}
return 0;
}
沒有留言:
張貼留言