# 題目: 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;
}