百練2798:2進制轉化爲16進制

總時間限制: 1000ms 內存限制: 65536kB
描述
輸入一個2進制的數,要求輸出該2進制數的16進製表示。
在16進制的表示中,A-F表示10-15
輸入
第1行是測試數據的組數n,後面跟着n行輸入。每組測試數據佔1行,包括一個以0和1組成的字符串,字符串長度至少是1,至多是10000
輸出
n行,每行輸出對應一個輸入。
樣例輸入
2
100000
111
樣例輸出
20
7
代碼如下:

#include<iostream>
#include<string>
#include<string.h>
using namespace std;
int main(){
string str;//二進制數字符串
int n;
cin >>n;//輸入要轉換的數字的個數
while(n--){
char hex[3000];//十六進制字符串
cin >>str;
int len =str.length();
int times=len/4;//被4整除的次數
int i;
int size =0;//16進制數的大小
int sum =0;//存儲每4位對應的數據,正好是16進制
int remainder =len%4;//單獨處理這個位上的數對應的16進制數,例如111,1111的前3位
if(remainder !=0){//計算最高几位對應的16進制
    for(i =0; i <remainder; i++){
     sum*=2;
     sum+=str[i]-'0';
    }
    if(sum >=10){//A-F處理
     hex[size++]=sum+'A'-10;
    }
    else{
     hex[size++]=sum+'0';
    }
}
for(i =0; i <times; i++){//餘下的每4位對應的16進制數
     sum =0;
     sum+=(str[remainder+4*i]-'0')*8+(str[remainder+4*i+1]-'0')*4+(str[remainder+4*i+2]-'0')*2+(str[remainder+4*i+3]-'0');//例如1101=1*8+1*4+0*2+1*1
     if(sum >=10){
     hex[size++]=sum+'A'-10;
    }
    else{
     hex[size++]=sum+'0';
    }
}
hex[size]='\0';//給末尾添加一個空白字符
cout<<hex<<endl;
}

return 0;
}
發佈了57 篇原創文章 · 獲贊 32 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章