进制转换
题目描述
请你编一程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制 n (2 ≤ n ≤ 16),第二行是一个 n 进制数,若 n>10 则用大写字母 A∼F 表示数码 10∼15,并且该 n 进制数对应的十进制的值不超过 10^9,第三行也是一个正整数,表示转换之后的数的进制 m (2≤m≤16)。
输出格式
一个正整数,表示转换之后的 m 进制数。
输入输出样例
输入 1
16 FF 2
输出 1
11111111
看到这道题,我么首先的思路是先将n进制数转化为一个十进制数,再将十进制数转化为m进制数
将n进制转化为十进制的方法为:将n进制数每一位依次乘n的对应次方
比如将二进制数1011011转化为十进制

二进制转化十进制程序如下:
int a[1001]={};
string s;//s是二进制数
cin>>s;
for(int i=0;i<a.length();i++){
a[i]=int(s[i])-48;//存入a数组('0'的ASCII码是48)
}
int shi=0;
for(int i=0;i<a.length();i++){
shi+=pow(2,n-i-1)*a[i];//转换每一位
//由于是从左到右从小到大,所以是2的n-i-1次方
}
//最后变量shi中存的就是转化后的十进制数
下一步就是把转化后的十进制数给转换为m进制的数:
将十进制数转化为m进制数的方法是:一直除以m,直到为零,将过程中的余数反过来,就成了对应的m进制数。
又拿二进制数来举例吧!
比如将十进制数53转化为二进制数:

所以十进制数53的二进制数就是110101
代码如下:
stack<char> tt;//由于要倒序,所以用栈来存储
//shi中存储的是十进制数
while(shi){
int t=shi%bj;//余数
if(t>=10)tt.push(char(t+55));//如果大于十,要存入字母
else tt.push(char(t+48));//否则就直接存数字
shi/=bj;//取到除以m之后的数
}
while(tt.size()){//输出
cout<<tt.top();
tt.pop();
}
解决了以上问题,代码就很好写了
#include<bits/stdc++.h>
using namespace std;
int s[10001];
int main(){
int aj;
cin>>aj;
string a;
cin>>a;
for(int i=0;i<a.length();i++){
if(a[i]>='0'&&a[i]<='9')
s[i]=int(a[i])-48;
else
s[i]=int(a[i])-55;
}
int bj;
cin>>bj;
int shi=0;
for(int i=0;i<a.length();i++){
shi+=pow(aj,a.length()-i-1)*s[i];
}
stack<char> tt;
while(shi){
int t=shi%bj;
if(t>=10)tt.push(char(t+55));
else tt.push(char(t+48));
shi/=bj;
}
while(tt.size()){
cout<<tt.top();
tt.pop();
}
return 0;
}
浙公网安备 33010602011771号