问题描述
给定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; }