题目链接:
KY235 进制转换2 https://www.nowcoder.com/questionTerminal/ae4b3c4a968745618d65b866002bbd32
描述
将M进制的数X转换为N进制的数输出。
输入描述:
输入的第一行包括两个整数:M和N(2<=M,N<=36)。
下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。
输出描述:
输出X的N进制表示的数。
示例1
输入:
10 2
11
输出:
1011
备注:
注意输入时如有字母,则字母为大写,输出时如有字母,则字母为小写。
思路:
将M进制数转换为N进制数。可以先将数从M进制转换为十进制,再从十进制转换为N进制。对于本题,需要注意的是,进制大于10时,就要用字符来表示,而这需要实现字符与数字之间的转换。
求解十进制数x的k进制表示时,只需不断地对x求余(对k)、求商(除以k),即可由低到高依次得到各个数位上的数。反过来,要求由k进制表示的数字的十进制值时,需要依次计算各个数位上的数字与该位权重的积(第n位的权重为k"-1),然后将它们依次累加,即可得到该十进制值。
源代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
//例题6.4 进制转换2
//将字符转换成整型数
//题目已说明:输入时如有字母,则字母为大写。这里在转换字母是要减去'A'
int CharToInt(char c) {
if (c >= '0' && c <= '9') {
return c - '0';
}
else {
return c - 'A' + 10;
}
}
//将整型数转换成字符串
//题目已说明:输出时如有字母,则字母为小写。这里在转换字母是要加上'a'
char IntToChar(int n) {
if (n >= 0 && n <= 9) {
return n + '0';
}
else {
return n - 10 + 'a';
}
}
int main()
{
int m, n;
cin >> m >> n;
string str;
cin >> str;
long long num = 0;
//m进制转10进制
for (int i = 0; i < str.size(); i++) {
num *= m;
num += CharToInt(str[i]);
}
//10进制转n进制 “除n取余法”
vector<char> nums;
while (num != 0) {
nums.push_back(IntToChar(num % n));
num /= n;
}
//逆序输出
for (int i = nums.size() - 1; i >= 0; i--) {
cout << nums[i];
}
cout << endl;
return 0;
}