問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。ios
輸入格式
輸入的第一行爲一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~九、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每一個十六進制數長度不超過100000。測試
輸出格式
輸出n行,每行爲輸入對應的八進制正整數。spa
【注意】
輸入的十六進制數不會有前導0,好比012A。
輸出的八進制數也不能有前導0。code
樣例輸入
2
39
123ABCci
樣例輸出
71
4435274字符串
【提示】
先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。string
#include<iostream> #include<string> using namespace std; int main() { //freopen("data.txt","r",stdin); //此句用來測試 string six,oct[10],bin; //six存儲每個輸入的十六進制,oct存儲總的轉換後的八進制,bin存儲每個中間二進制 int n; cin>>n; int binlen=bin.size(); int flagbin=0; for(int i=0;i<n;i++) { cin>>six; bin.erase(0,binlen); //每一輪使用bin存儲二進制前先將其初始化 for(int j=0;j<six.size();j++) { switch(six[j]){ //十六進制轉二進制,比較直白粗暴的方法 case '0':bin+="0000";break; case '1':bin+="0001";break; case '2':bin+="0010";break; case '3':bin+="0011";break; case '4':bin+="0100";break; case '5':bin+="0101";break; case '6':bin+="0110";break; case '7':bin+="0111";break; case '8':bin+="1000";break; case '9':bin+="1001";break; case 'A':bin+="1010";break; case 'B':bin+="1011";break; case 'C':bin+="1100";break; case 'D':bin+="1101";break; case 'E':bin+="1110";break; case 'F':bin+="1111";break; } } binlen=bin.size(); flagbin=0; int flagoct=0; int lenth=0; while(bin[flagbin]=='0') //去除二進制前綴0 { flagbin++; binlen--; } if(flagbin!=0) bin.erase(0,flagbin); if(binlen%3==1) //向3的倍數補齊,便於八進制轉換 { bin="00"+bin; } else if(binlen%3==2) { bin="0"+bin; } binlen=bin.size(); for(flagbin=0;flagbin<binlen;) //將二進制轉換爲八進制 { int tempnum; tempnum=(bin[flagbin++]-'0')*4+(bin[flagbin++]-'0')*2+(bin[flagbin++]-'0'); switch(tempnum){ //同暴力轉換 case 0:oct[i]+='0' ;break; case 1:oct[i]+='1' ;break; case 2:oct[i]+='2' ;break; case 3:oct[i]+='3' ;break; case 4:oct[i]+='4' ;break; case 5:oct[i]+='5' ;break; case 6:oct[i]+='6' ;break; case 7:oct[i]+='7' ;break; } } } for(int p=0;p<n;p++) { cout<<oct[p]<<endl; } return 0; }
1.八進制轉換二進制時,忘了減‘0’
減‘0’是爲了將字符形式的數字轉化爲int型進行計算,計算出tempnum後再使用switch句型轉化爲字符形式的八進制。
2.bin使用後忘記清空字符串
即每輪輸入使用bin存儲二進制後再次使用時忘記清除,在每輪開始前進行初始化便可it