P1143 进制转换
摘要:编一个程序实现两种不同进制之间的数据转换。
解题思路:其实思路不是很难,就是把n进制数先转换为十进制,再由十进制转换为m进制的数。
首先要实现的就是把n进制数转换为十进制数,我们用乘法把他算出来。
比如说一个16进制数FFF换算为十进制,F=15,也就是说他的第一位、第二位和第三位上都是15。
倒数第一位上面的F表示的是15个1,也就是15*1=15。
倒数第二位上面的F,因为是每满16进1,它有15个16,所以表示15*16=240。
倒数第三位上面的F,也是每满16进1,它有15个16*16,表示的是15*16*16=3840。
我们再把他们加在一起:15+240+3840=4095。
这样我们就成功把16进制数FFF转换为10进制了。
这是代码:
for(int i=m.length()-1;i>=0;i--){//首先用n进制的数改成十进制的。
if(b[i]=='A') shi+=10*ans;//b是一个n进制数。
else if(b[i]=='B') shi+=11*ans;//这里还可以用ascii码或者数组的方式来计算,那样比较简洁美观一些。
else if(b[i]=='C') shi+=12*ans;//shi表示的是b转化为十进制时的数
else if(b[i]=='D') shi+=13*ans;
else if(b[i]=='E') shi+=14*ans;
else if(b[i]=='F') shi+=15*ans;
else shi+=(b[i]-'0')*ans;//每次都让他乘ans,ans是现在这一位每一个数表示的几。
ans*=n;//每次都让ans乘一个n,因为每次它都满n进1
}
接下来我们又要面临一个问题:把这个10进制的数转换成m进制。
这个就好办些了,用短除法就好:
ans=0;//这里ans起到的是计数的作用(也用来当作下标),每次++。
string shu[20]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};//用一个字符串把每一个数字对应的数或者字符都存下来,在取余数时可以简单一些。
while(shi>0){
h[ans]=shu[shi%m];//取余数,然后保存下来。
shi/=m;//取完余数了就把shi直接除掉。
ans++;
}
最后再把它倒着输出出来就好了:
for(int i=ans-1;i>=0;i--){//因为我们存的时候是倒着的,所以我们也要把他倒着输出出来。
cout<<h[i];
}
完整代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,shi=0,ans=1;
string b,h[10010],shu[20]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
int main(){
cin>>n>>b>>m;
for(int i=m.length()-1;i>=0;i--){//首先用n进制的数改成十进制的。
if(b[i]=='A') shi+=10*ans;//b是一个n进制数。
else if(b[i]=='B') shi+=11*ans;//这里还可以用ascii码或者数组的方式来计算,那样比较简洁美观一些。
else if(b[i]=='C') shi+=12*ans;//shi表示的是b转化为十进制时的数
else if(b[i]=='D') shi+=13*ans;
else if(b[i]=='E') shi+=14*ans;
else if(b[i]=='F') shi+=15*ans;
else shi+=(b[i]-'0')*ans;//每次都让他乘ans,ans是现在这一位每一个数表示的几。
ans*=n;//每次都让ans乘一个n,因为每次它都满n进1
}
ans=0;//这里ans起到的是计数的作用(也用来当作下标),每次++。
string shu[20]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};//用一个字符串把每一个数字对应的数或者字符都存下来,在取余数时可以简单一些。
while(shi>0){
h[ans]=shu[shi%m];//取余数,然后用字符串h保存下来。
shi/=m;//取完余数了就把shi直接除掉。
ans++;
}
for(int i=ans-1;i>=0;i--){//因为我们存的时候是倒着的,所以我们也要把他倒着输出出来。
cout<<h[i];
}
return 0;
}