# 題目: UVa 389 - Basically Speaking
# 題目說明
給一串數字,並告訴你它是 n
進位的數字,將它轉為 m
進位的數字,並遵守以下規則:
- 有 7 位數的輸出,超過以
ERROR
表示 - 使用數字
0 - 9
與字母A - F
n
及m
的範圍為2 - 16
INPUT:
每筆資料輸入 1 個字串、兩個整數 n
及 m
OUTPUT:
輸出轉換過後的數字,7 位數為限,並向右靠齊
# 解題方法
- 先將
n
進位的數字轉為 10 進位
(使用一個基底div = 1
,從個位開始,每向前一位div * n
) - 將 10 進位的數字轉為
m
進位 - 最後分別處理超過 7 位及 0 位的情況
# 參考程式碼
#include <iostream> | |
using namespace std; | |
int main() | |
{ | |
// fast io | |
ios::sync_with_stdio(false); | |
cin.tie(nullptr); | |
cout.tie(nullptr); | |
string str; | |
int n, m; | |
while (cin >> str >> n >> m) | |
{ | |
int _10 = 0; | |
string ans; | |
// turn the base n to decimal | |
for (int i = str.size() - 1, div = 1; i >= 0; --i, div *= n) | |
{ | |
if (str[i] <= '9') _10 += (str[i] - '0') * div; | |
else _10 += (str[i] - 'A' + 10) * div; | |
} | |
// turn decimal to base m | |
while (_10 > 0) | |
{ | |
if (_10 % m < 10) ans.push_back(_10 % m + '0'); | |
else ans.push_back(_10 % m -10 + 'A'); | |
_10 /= m; | |
} | |
if (ans.size() > 7) cout << " ERROR"; | |
else | |
{ | |
if (ans.empty()) ans.push_back('0'); | |
int sp = 7 - ans.size(); | |
while (sp-- != 0) cout << " "; | |
for (int i = ans.size() - 1; i >= 0; --i) cout << ans[i]; | |
} | |
cout << "\n"; | |
} | |
return 0; | |
} |