時間限制:1.0s 內存限制:512.0MB
問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
輸入的第一行爲一個正整數n (1=n=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式
輸出n行,每行爲輸入對應的八進制正整數。
注意
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
提示
先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。
處理:
如, ABCD從後往前將每3位十六進制轉化爲十進制, 十進制是相對於十六進制的順尋逆序存儲的,再將十進制的數轉化成8進制, 每餘8就存到eight數組, 若不足4爲就自動補全, 最後再逆序輸出
#include<stdio.h>
#include<string.h>
#define N 100005
char str[N];
int ten[N];
int eight[133000];
int main(){
int n;
int i, j, k;
scanf("%d", &n);
while(n--){
int a, b, c, tmp, count;
scanf("%s", str);
int len = strlen(str);
// printf("%d\n", len);
j = 0;
for(i = len - 1; i >= 0; i = i - 4){
if( i - 2 >= 0){
i = i - 2;
count = 3;
}
else if(i - 1 < 0)
count = 1;
else if(i - 1 >= 0){
count = 2;
i = i - 1;
}
c = 0;
while(count--){
if(str[i] >= '0' && str[i] <= '9')
tmp = str[i] - '0';
if(str[i] >= 'A' && str[i] <= 'Z')
tmp = str[i] - 'A' + 10;
c = c * 16 + tmp;
//printf("%d\t%d\n", tmp, c);
i++;
}
//printf("----%d\n", c);
ten[j++] = c;
}
k = 0;
for(i = 0; i < j; i++){
count = 4;
while(ten[i] && count--){
eight[k++] = ten[i] % 8;
ten[i] = ten[i] / 8;
}
while(count--){
eight[k++] = 0;
}
}
for(i = k - 1; eight[i] == 0; i--);
for( ; i >= 0; i--){
printf("%d", eight[i]);
}
printf("\n", eight[i]);
}
return 0;
}