C/C++<算法>进制转换超详细

16转10

  • 用竖式计算:
    16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方
第0位: 5 * 16^0 = 5
第1位: F * 16^1 = 240
第2位: A * 16^2= 2560
第3位: 2 * 16^3 = 8192

-代码

#include <iostream>
#include <string>
using namespace std;
int main() {
    string s;
    while(cin>>s){
        int length=s.length();
        long long sum=0;
        for(int x=0;x<length;x++){
            if(s[x]>='0'&&s[x]<='9'){
                sum=(s[x]-'0')+16*sum;
            }else{
                sum=(s[x]-'A'+10)+16*sum;
            }
        }
        cout<<sum;
    }
    return 0;
}

16转2

  • 由于在二进制的表示方法中,每四位所表示的数的最大值对应16进制的15,即16进制每一位上最大值,所以,我们可以得出简便的转换方法,将16进制上每一位分别对应二进制上四位进行转换
#include <iostream>
#include <string>
using namespace std;
int main() {
    string s;
    while(cin>>s){
        int length=s.length();
        long long sum=0;
        int answer[40];
        int cot=0;
        for(int x=0;x<length;x++){
                int y=2;
            if(s[x]>='0'&&s[x]<='9'){
               y=(s[x]-'0');
            }else{
               y=(s[x]-'A'+10);
            }
            do{
                answer[cot++]=y%2;
                 y/=2;
            }while(y!=0);
        }
       for(int i=0;i<cot;i++){
            cout<<answer[cot-1-i];
       }

    }
    return 0;
}

2转16进制

  • 16进制就有16个数,0~15,用二进制表示15的方法就是1111,从而可以推断出,16进制用2进制可以表现成0000~1111,顾名思义,也就是每四个为一位

0 0 1 1| 1 1 0 1
左半边=2+1=3 右半边=8+4+1=13=D
  • 代码

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
    string s;
    while(cin>>s){
        int length=s.length();
        string s2;
        int pro=1,sum=0,cot=0;
        for(int x=length-1;x>=0;x--){
             sum+=(s[x]-'0')*pro;
             pro=pro*2;
            if(x%4==0){
               if(sum>=10){
                  s2+=sum-10+'A';
               }else{
                  s2+=sum+'0';
               }
                pro=1;
                sum=0;
             }
        }
       reverse(s2.begin(),s2.end());
       cout<<s2;

    }
    return 0;
}

10进制转16进制

-代码

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
    long long s;
    while(cin>>s){
        char ans[20]={0};
        int cot=0;
       do{
        if(s%16>=10){
            ans[cot++]=s%16-10+'A';
        }else{
            ans[cot++]=s%16+'0';
        }
        s/=16;
       }while(s);

        for(int i=0;i<cot;i++){
            cout<<ans[cot-1-i];
        }
    }
    return 0;
}

十六进制转八进制

  • 一开始想的是把16进制先转化为10进制,因为从10进制转化为8进制很容易。但是题目中输入的16进制位数规模大,不超过100000位,肯定不能化为10进制数。解法是先把16进制化为四个2进制数,然后三个二进制数一组再化为8进制。 注意 39(16进制)--〉0011 1001 (2进制) --〉111 001(8进制),是从二进制的低位开始三个一组来计算。
  • 代码
posted @ 2017-12-18 00:50 ---dgw博客 阅读(...) 评论(...) 编辑 收藏