熱門文章

2025年9月11日 星期四

ZeroJudge 解題筆記:d681. BinaryCount

作者:王一哲
日期: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;
}


沒有留言:

張貼留言