熱門文章

2026年2月25日 星期三

ZeroJudge 解題筆記:c089. 00389 - Basically Speaking

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


沒有留言:

張貼留言