日期: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;
}
沒有留言:
張貼留言