进制转换
题目描述
请你编一程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16),第二行是一个n进制数,若n>10则用大写字母A-F表示数码10-15,并且该n进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)。
输出格式
一个正整数,表示转换之后的m进制数。
样例输入:
16
FF
2
样例输出:
11111111
解题思路
比较菜,所以用的也是很容易想到的一种方式,先将n进制数转换成10进制数,然后再用10进制数转换成m进制数。
十进制转换成m进制数是比较简单的,就是除m取余。
那么n进制数转换成10进制呢,我们拿2进制数来举例,其他的都是类似的。比如现在有个2进制数是 1110,那么我们转换成10进制数字时,一般就是1*2^3+1*2^2 + 1*2^1 + 0*2^0 ,如图
代码如下
#include<bits/stdc++.h>
using namespace std;
map<char,int>mp;
int main() {
mp['1'] = 1;mp['2'] = 2;mp['3'] = 3;
mp['4'] = 4;mp['5'] = 5;mp['6'] = 6;
mp['7'] = 7;mp['8'] = 8;mp['9'] = 9;
mp['0'] = 0;mp['A'] = 10;mp['B'] = 11;
mp['C'] = 12;mp['D'] = 13;mp['E'] = 14;mp['F'] = 15;
int n,m;
char s[100];
char a[100];
scanf("%d",&n);
scanf("%s",s);
scanf("%d",&m);
int x = 0;
for(int i = 0; i<strlen(s); i++) {//n进制转换为10进制
x = x*n+mp[s[i]]; //就是上面那个图所解释的
}
int l = 0;
while(x>0) { //10进制转换为m进制
l++;
int cnt = x%m;
if(cnt>9) {
a[l] = cnt+'A'-10;
}
else {
a[l] = cnt + '0';
}
x /= m;
}
for(int i = l; i>0; i--) { //倒序输出
printf("%c",a[i]);
}
}