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

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

  • 相关阅读:
    ETCD集群部署 和flanne网络插件通信原理介绍
    prometheus02 nodeexporter部署及使用
    docker容器的存储资源(volume)
    ActionScript 3.0 事件机制小结
    ActionScript 3.0 装饰器模式实例
    固定头和底,中间部分自适应布局
    ActionScript 3.0 MVC模式小实例
    A*算法的Actionscript3.0实例
    [Database]sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
    在phpstorm中svn的使用
  • 原文地址:https://www.cnblogs.com/dgdger/p/12846671.html
Copyright © 2020-2023  润新知