zoukankan      html  css  js  c++  java
  • 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;
    }

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

  • 相关阅读:
    dedecms调用指定栏目名称,链接
    修改 Dedecms 文档文章标题长度的方法
    dedeCMS的arclist标签中limit是什么意思
    DedeCms织梦系统[field:description /]标签如何限制字数?
    mysql 如何更改root密码
    允许phpmyadmin空密码登录的配置方法
    Apache启动失败解决办法
    Apache 配置多域名、二级域名
    使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
    使用UITextField自动格式化银行卡号
  • 原文地址:https://www.cnblogs.com/dgdger/p/12846671.html
Copyright © 2011-2022 走看看