题目:
链接:https://ac.nowcoder.com/acm/contest/83391/B
来源:牛客网
题目描述
众所周知
16
16 进制中的
10
10~
15
15 用字母
𝐴
A~
𝐹
F 表示。那么如果用字母
𝐴
A~
𝑍
Z 表示数字
10
10~
35
35,用
𝑎
a~
𝑧
z 表示数字
36
36~
61
61,就可以得到一种
62
62 进制的表示法;现在给出一个
𝑥
x 进制数字
𝑎
a,请你将它转化成
𝑦
y 进制数字并输出。
输入描述:
一行两个数字
𝑥
,
𝑦
(
2
≤
𝑥
,
𝑦
≤
62
)
x,y(2≤x,y≤62) 以及
𝑎
(
0
≤
𝑎
≤
𝑥
120
)
a(0≤a≤x
120
),含义与题目相同。
输出描述:
一个
𝑦
y 进制下的数字。
示例1
输入
复制
16 2 FB
输出
复制
11111011
代码:
include[HTML_REMOVED]
using namespace std;
int x, y;
vector[HTML_REMOVED] divi(vector[HTML_REMOVED] &all, int d, int &r)
{
vector[HTML_REMOVED] c;
for(int i = all.size() - 1; i >= 0; i–)
{
r = r * x + all[i];
c.push_back((r / d));
r %= d;
}
reverse(c.begin(), c.end());
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c;
}
int main() {
cin >> x >> y;
string s;
cin >> s;
vector[HTML_REMOVED] all, ans;
//每个字符变成对应的数字 10 36
for(int i = s.size() - 1; i >= 0; i–)
{
if(s[i] >= ‘0’ && s[i] <= ‘9’) all.push_back(s[i] - ‘0’);
else if(s[i] >= ‘A’ && s[i] <= ‘Z’) all.push_back(s[i] - ‘A’ + 10);
else if(s[i] >= ‘a’ && s[i] <= ‘z’) all.push_back(s[i] - ‘a’ + 36);
}
//高精度除法
while(!(all.size() == 1 && all[0] == 0)) //不为00etc
{
int r = 0;//余数
all = divi(all, y, r);//循环
ans.push_back(r);
}
reverse(ans.begin(), ans.end());
for(int x : ans) {
if(x <= 9) cout << x;
else if(x >= 10 && x <= 35) cout << char(x + ‘A’ - 10);
else if(x >= 36) cout << char(x + ‘a’ - 36);
}
cout << endl;
return 0;
}