http://lx.lanqiao.org/problem.page?gpid=T51
基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
39
123ABC
样例输出
71
4435274
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
分析:
直接模拟进制转换即可、
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 char s[100010]; 6 int change(int m,int n) 7 { 8 int res=0; 9 for(int i = m; i <= n; i++) 10 if(s[i]>'9') res = res * 16 + s[i] - 'A' + 10; 11 else res = res*16 + s[i] -'0'; 12 return res; 13 } 14 int main() 15 { 16 int n,i; 17 cin>>n; 18 while(n--) 19 { 20 scanf("%s",s); 21 int len = strlen( s ) ; 22 int index=0; 23 bool flag = true; 24 if(len % 3 == 1) 25 printf("%o",change(0,0)), flag = false,index = 1; 26 if(len % 3 == 2) 27 printf("%o",change(0,1)), flag = false,index = 2; 28 for(i = index; i < len; i+=3) 29 { 30 if(flag) 31 { 32 flag = false; 33 printf("%o",change(i,i+2)); 34 } 35 else 36 { 37 printf("%04o",change(i,i+2)); 38 } 39 } 40 cout<<endl; 41 } 42 return 0; 43 }