日期:2026年2月25日
ZeroJudge 題目連結:c089. 00389 - Basically Speaking
解題想法
由於 Python 的 int 內建了用指定進位制將字串轉換成 10 進位整數的功能,這部分可以使用預設工具;但是輸出格式之中沒有對應 7 進位制的工具,需要自己寫。而 C++ 則是兩個部分都要自己寫。
Python 程式碼
使用時間約為 7 ms,記憶體約為 2.9 MB,通過測試。
import sys
def ntos(n, base): # 輸入整數 n、基底 base,輸出轉換後的字串
# 數字 0 ~ 15 對應的字元
table = {0: '0', 1: '1', 2: '2', 3: '3',
4: '4', 5: '5', 6: '6', 7: '7',
8: '8', 9: '9', 10: 'A', 11: 'B',
12: 'C', 13: 'D', 14: 'E', 15: 'F'}
s = "" # 儲存結果用的字串
while n > 0: # 如果 n 大於 0 繼續執行
s = table[n%base] + s # 取 n%base 對應的字元加到 s 前面
n //= base # n 變為 1/base 倍
return s # 回傳 s
for line in sys.stdin:
arr = line.split() # 分割後會轉為串列存到 arr
# 先將字串用指定的基底 arr[1] 轉成 10 進位整數,再用 ntos 轉成 arr[2] 進位字串
s = ntos(int(arr[0], int(arr[1])), int(arr[2]))
m = len(s) # s 的長度
if m > 7: print(" ERROR") # 長度大於 7,印出 ERROR
else: print(" "*(7-m) + s) # 反之前面補空格到長度為 7 再輸出
C++ 程式碼
使用時間約為 1 ms,記憶體約為 348 kB,通過測試。
#include <iostream>
#include <string>
#include <map>
using namespace std;
int ston(string s, int base) { // 輸入字串 s、基底 base,輸出轉換後的整數
// 數字 0 ~ 15 對應的字元
map<char, int> table =
{{'0', 0}, {'1', 1}, {'2', 2}, {'3', 3},
{'4', 4}, {'5', 5}, {'6', 6}, {'7', 7},
{'8', 8}, {'9', 9}, {'A', 10}, {'B', 11},
{'C', 12}, {'D', 13}, {'E', 14}, {'F', 15}};
int n = 0, curr = 1; // 儲存結果用的整數 n,目前的基底 curr
for(auto it = s.crbegin(); it != s.crend(); it++) { // 從最後一位往前讀取
n += table[*it] * curr; // *it 轉成整數乘以 curr 再加到 n
curr *= base; // curr 乘以 base
}
return n; // 回傳 n
}
string ntos(int n, int base) { // 輸入整數 n、基底 base,輸出轉換後的字串
// 數字 0 ~ 15 對應的字元
map<int, char> table =
{{0, '0'}, {1, '1'}, {2, '2'}, {3, '3'},
{4, '4'}, {5, '5'}, {6, '6'}, {7, '7'},
{8, '8'}, {9, '9'}, {10, 'A'}, {11, 'B'},
{12, 'C'}, {13, 'D'}, {14, 'E'}, {15, 'F'}};
string s = ""; // 儲存結果用的字串
while(n > 0) { // 如果 n 大於 0 繼續執行
s = table[n%base] + s; // 取 n%base 對應的字元加到 s 前面
n /= base; // n 變為 1/base 倍
}
return s; // 回傳 s
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
string s; // 要轉換的字串
int a, b; // 從基底 a 轉換成基底 b
while(cin >> s >> a >> b) {
// 先將字串用指定的基底 a 轉成 10 進位整數,再轉成 b 進位字串
string t = ntos(ston(s, a), b);
int m = (int)t.size(); // t 的長度
if (m > 7) { // 長度大於 7,印出 ERROR
cout << " ERROR\n";
} else { // 反之前面補空格到長度為 7 再輸出
for(int i=0; i<7-m; i++) t = " " + t;
cout << t << "\n";
}
}
return 0;
}
沒有留言:
張貼留言