问题:十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
1 #include<stdio.h> 2 #include<string.h> 3 int b[100000]; 4 int initial; 5 int cun[1000]; 6 void fine(int cun[],int p){ 7 int i,j; 8 for(i=p-1;i>=0;i--){ 9 while(cun[i]){ 10 for(j=i;j>=0;j--) printf("%d",cun[j]); 11 return; 12 } 13 } 14 } 15 void eight(int b[]){ 16 int p=0,i; 17 int sum,fun[]={1,2,4}; 18 for(i=0;i<initial;){ 19 sum=0; 20 int k=0; 21 while(i<initial){ 22 sum+=b[i]*fun[k++]; 23 i++; 24 if(k==3) break; 25 } 26 cun[p++]=sum; 27 } 28 fine(cun,p); 29 } 30 void Two(int num){ 31 if(num==0){ 32 while(initial%4) b[initial++]=0; 33 return; 34 } 35 b[initial++]=num%2; 36 Two(num/2); 37 38 } 39 void SixTeen(char str[],int n){ 40 int num; 41 if(n-1<0){ 42 return; 43 } 44 if(str[n-1]>=‘A‘) num=(str[n-1]-55); 45 else num=(str[n-1]-48); 46 Two(num); 47 SixTeen(str,n-1); 48 } 49 int main(){ 50 char str[10][100000]; 51 int n,i,j; 52 memset(b,-1,sizeof(b)); 53 scanf("%d",&n); 54 for(i=0;i<n;i++){ 55 scanf("%s",str[i]); 56 } 57 for(j=0;j<n;j++){ 58 n=strlen(str[j]); 59 initial=0; 60 SixTeen(str[j],n); 61 eight(b); 62 printf("\n"); 63 } 64 65 }