资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
在这里插入代码片
#include<stdio.h>
#include<math.h>
int main()
{
int i, n;
scanf("%d", &n);
char s[n][1001];
char s1[n][10000];
int c[n];
for(i=0; i<n; i++) {
getchar();
scanf("%s", &s[i]);
}
//十六进制转二进制
int j, l=0;
for(i=0; i<n; i++) {
l=0;
for(j=0; s[i][j] != '\0'; j++) {
if(s[i][j] >= '0' && s[i][j] <= '9' ) {
int k;
int a = s[i][j] - '0';
for(k=3; k>=0 && s[i][j] != '\0'; k--) {
if(a >= pow(2, k)) {
s1[i][l++] = '1';
a = a - pow(2, k);
}
else {
s1[i][l++] = '0';
}
}
}
else if(s[i][j] >= 'A' && s[i][j] <= 'F'){
int k;
int a = s[i][j] - 'A' + 10;
for(k=3; k>=0 && s[i][j] != '\0'; k--) {
if(a >= pow(2, k)) {
s1[i][l++] = '1';
a = a - pow(2, k);
}
else{
s1[i][l++] = '0';
}
}
}
}
c[i] = l;
}
//二进制转八进制
char s2[n][1000];
for(i=0; i<n; i++) {
int k=0;
int sum=0;
int q=0;
for(j=c[i]-1; j>=0; j--, k++) {
if(k >= 3) {
s2[i][q++] = (sum + '0');
k=0;
sum = 0;
}
sum = sum + (s1[i][j] - '0') * pow(2, k);
}
s2[i][q++] = (sum + '0');
c[i] = q;
}
//输出
for(i=0; i<n; i++) {
for(j=c[i]-1; j>=0; j--) {
if(s2[i][j] != '0') break;
}
int k;
for(k=j; k>=0; k--) {
printf("%c", s2[i][k]);
}
printf("\n");
}
return 0;
}