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;
}

以上就是我这道题的全部思路,如果有什么不对的地方,还请各位大佬及时向我纠正。

原文地址:https://www.cnblogs.com/dgdger/p/12846671.html