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進制),是從二進制的低位開始三個一組來計算。
  • 代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM