熱門文章

2025年2月3日 星期一

ZeroJudge 解題筆記:e799. p6. 資工系的浪漫

作者:王一哲
日期:2025年2月3日



ZeroJudge 題目連結:e799. p6. 資工系的浪漫

解題想法


這題用 Python 解題很方便,因為有內建的函式可以將整數轉換成 2 進位制的字串,如果用 C++ 就要自己寫轉換用的函式。

Python 程式碼


使用時間約為 22 ms,記憶體約為 3.3 MB,通過測試。
import sys

for line in sys.stdin:
    N, M = map(int, line.split())  # 圖形的高 N、寬 M
    C = input().strip()  # 字元 C,要用 strip() 刪除最後的 \n
    for _ in range(N):  # 讀取 N 行數字
        s = bin(int(input()))[2:]  # 讀取數字,用 bin 轉成 2 進位制的字串,刪除開頭的 0b
        if len(s) < M: s = "0"*(M-len(s)) +s  # 若 s 長度小於 M,在前面補 0
        for i, ch in enumerate(s):  # 依序由 s 讀取字元 ch,索引值 i
            if ch == "1": print(C, end="\n" if i == M-1 else " ")  # 如果 ch 是 1 印出符號 C
            else: print(".", end="\n" if i == M-1 else " ")  # 否則印出 .


C++ 程式碼


因為輸入的數字很大,用 int 會溢位。使用時間約為 3 ms,記憶體約為 360 kB,通過測試。
#include <iostream>
#include <string>
typedef long long LL;
using namespace std;

/* 自訂函式,輸入整數 d,轉成 2 進位制字串 */
string bin(LL d) {
    if (d == 0) return "0";  // 如果 d == 0,回傳字串 0
    string s = "";  // 儲存結果用的空白字串
    while(d) {  // 若 d 大於 0 繼續執行
        s = to_string(d&1) + s;  // 將 d 與 1 與 AND,轉成字串,加到 s 前面
        d >>= 1;  // d 除以 2
    }
    return s;  // 回傳 s
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int N, M;  // 圖形的高 N、寬 M
    while(cin >> N >> M) {   
        char C; cin >> C;  // 字元 C
        for(int i=0; i<N; i++) {  // 讀取 N 行數字
            LL d; cin >> d;  // 讀取數字
            string s = bin(d);  // 呼叫自訂函式 bin,將 d 轉成 2 進位制字串
            while((int)s.size() < M) s = "0" + s;  // 若 s 長度小於 M,在前面補 0
            for(int j=0; j<M; j++) {  // 依序由 s 讀取字元,索引值 j
                if (s[j] == '1') cout << C << " \n"[j == M-1];  // 如果 s[i] 是 1 印出符號 C
                else cout << "." << " \n"[j == M-1];  // 否則印出 .
            }
        }
    }
    return 0;
}


沒有留言:

張貼留言