十八:十六进制转八进制

问题:十六进制转八进制  
问题描述

  给定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("
");
63     }
64 
65 }
原文地址:https://www.cnblogs.com/yuming226/p/8150863.html