蓝桥杯十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#include<iostream> #include<cmath> #include<vector> #include<set> #include<cstring> #include<string> #include<algorithm> using namespace std; int main() { int n; string str1; string str; int k=0; int l=0; int num=0; int v; scanf("%d",&n); while(n--){ cin>>str1; str=""; for(int i=0;i<str1.length();i++){ switch(str1[i]){ case '0':str+="0000";break; case '1':str+="0001";break; case '2':str+="0010";break; case '3':str+="0011";break; case '4':str+="0100";break; case '5':str+="0101";break; case '6':str+="0110";break; case '7':str+="0111";break; case '8':str+="1000";break; case '9':str+="1001";break; case 'A':str+="1010";break; case 'B':str+="1011";break; case 'C':str+="1100";break; case 'D':str+="1101";break; case 'E':str+="1110";break; case 'F':str+="1111";break; } } if(str.length()%3==1){ str = "00"+str; }else if(str.length()%3==2){ str = "0"+str; } int flag=0; int num = 0; for(int i=0;i<str.length();i+=3){ num = (str[i]-'0')*4+(str[i+1]-'0')*2+(str[i+2]-'0'); if(num){ flag=1; } if(flag){ printf("%d",num); } } printf("\n"); } return 0; }
还是写的比较简单的= =,虽然借鉴了别人的思路。。。。。。