进制转换
题目描述
请你编一程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制 n ( 2 ≤ n ≤ 16 ) n\ (2\le n\le 16) n (2≤n≤16),第二行是一个 n n n 进制数,若 n > 10 n>10 n>10 则用大写字母 A ∼ F \verb!A!\sim \verb!F! A∼F 表示数码 10 ∼ 15 10\sim 15 10∼15,并且该 n n n 进制数对应的十进制的值不超过 1 0 9 10^9 109,第三行也是一个正整数,表示转换之后的数的进制 m ( 2 ≤ m ≤ 16 ) m\ (2\le m\le 16) m (2≤m≤16)。
输出格式
一个正整数,表示转换之后的 m m m 进制数。
样例 #1
样例输入 #1
16
FF
2
样例输出 #1
11111111
思路
输入一个整数,一个字符串,和另一个整数。第一个整数(n)代表源数的基数,字符串(src)代表源数(以字符串形式给出),第二个整数(m)代表目标基数。
然后,它从源数的最低有效位开始(即字符串的最右端),并逐个处理每一位。对于每一位,它首先检查这个字符是否大于’9’,也就是说,它是否是一个字母。如果是,那么它将该字符转换为对应的数字(A为10,B为11等等)。否则,它将该字符(一个数字字符)转换为对应的整数。然后,它将这个数乘以源基数的适当次方(对于最低有效位是0,次低有效位是1,依此类推),并将结果累加到一个总和中。这个总和(num1)最终将是源数转换为十进制的结果。
接下来,将这个十进制数转换为目标基数。通过不断地除以目标基数并取余数来做到这一点。每次取余数,它都会得到转换后的数的一位。如果这个余数大于9,那么它将这个余数转换为对应的字母;否则,它将这个余数转换为对应的数字字符。然后,它将这个字符添加到结果字符串的前面。这个过程一直持续到十进制数变为0。
最后,程序输出转换后的数(即目标基数的字符串表示)。这样就完成了从一个基数到另一个基数的转换。
AC代码
#include <cmath>
#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;
int n, m;
long long num1;
string src, dst;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> src >> m;
auto it1 = src.rbegin();
for (int i = 0; it1 != src.rend(); it1++, i++) {
int j = 0;
if (*it1 > '9') {
j = *it1 + 10 - 'A';
} else {
j = *it1 - '0';
}
num1 += j * pow(n, i);
}
// cout << num1 << endl;
dst = "";
for (int i = num1; num1 > 0; num1 /= m) {
int j = num1 % m;
// cout << j << endl;
if (j > 9) {
dst = (char)(j - 10 + 'A') + dst;
} else {
dst = (char)(j + '0') + dst;
}
}
cout << dst << endl;
return 0;
}