題目: UVa - 389 - Basically Speaking

題目說明

給一個字串表示數值,及 nm,表示該值是 n 進位,要求轉換為 m 進位。

除此之外,有三個要求:

  • 轉換後不可超過 7 位數,若超過則輸出 "ERROR"
  • 字串只會出現 A ~ F 及 0 ~ 9。
  • n、m 的範圍為 2 ~ 16。

且輸出時需靠右對齊。

Input: 每行有三個變數,分別為該字串、nm

Output: 輸出轉換後的數值。

解題思路

根據題目要求做轉換,先轉換為十進位再轉換成題目要求的進位數,需要注意的是要靠右對齊,所以不足 7 位的要補上空白。

參考解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <bits/stdc++.h>

using namespace std;

static auto __ = []
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
return 0;
}();

string orgin;
int n;
int m;
int Dec;
list<char> ret;

void split()
{
stringstream ss(orgin);
ss >> orgin >> n >> m;
}

void cvtToDec()
{
for (auto& ch : orgin)
Dec = Dec * n + (isalpha(ch) ? ch - 'A' + 10 : ch - '0');
}

void cvtToAns()
{
ret.clear();

while (Dec)
{
int tmp = Dec % m;
ret.push_front(tmp < 10 ? tmp + '0' : tmp - 10 + 'A');
Dec /= m;
}

if (ret.empty()) ret.push_back('0');
}

void print()
{
if (ret.size() > 7) { cout << " ERROR\n"; return; }

while (ret.size() < 7) ret.push_front(' ');
for (auto& ch : ret) cout << ch;
cout << '\n';
}

int main()
{
while (getline(cin, orgin))
{
split();
cvtToDec();
cvtToAns();
print();
}
}