十六進制轉換為八進制
問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進制正整數。
【注意】
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。
#include<iostream> using namespace std; int main() { int n; cin>>n; for(int i=0;i<n;++i) { string str,str2="",str8=""; cin>>str; int len=str.length(); for(int j=0;j<len;++j) { switch(str[j]) { case '0' : str2+="0000";break; case '1' : str2+="0001";break; case '2' : str2+="0010";break; case '3' : str2+="0011";break; case '4' : str2+="0100";break; case '5' : str2+="0101";break; case '6' : str2+="0110";break; case '7' : str2+="0111";break; case '8' : str2+="1000";break; case '9' : str2+="1001";break; case 'A' : str2+="1010";break; case 'B' : str2+="1011";break; case 'C' : str2+="1100";break; case 'D' : str2+="1101";break; case 'E' : str2+="1110";break; case 'F' : str2+="1111";break; } } int len2=str2.length(); if(len2%3==1) { str2="00"+str2; len2+=2; } else if(len2%3==2) { str2="0"+str2; ++len2; } for(int j=0;j<len2-2;j+=3) { int s8=(str2[j]-'0')*4+(str2[j+1]-'0')*2+str2[j+2]-'0'; str8+='0'+s8; } int p=0; while(str8[p]=='0') ++p; int len8=str8.length(); for(int j=p;j<len8;++j) { cout<<str8[j]; } cout<<endl; } return 0; }

浙公網安備 33010602011771號