16进制转8进制代码(初学级别)

来源:互联网 发布:奥特曼战斗力官方数据 编辑:程序博客网 时间:2024/04/29 06:39
C语言为入门级别,有很多不足,希望各位大神指导

代码目标:
      给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

代码如下
#include <stdio.h>#include <malloc.h>void Get16_2(char c,int r[]){switch(c){case '0':r[0]=0;r[1]=0;r[2]=0;r[3]=0;break;case '1':r[0]=0;r[1]=0;r[2]=0;r[3]=1;break;case '2':r[0]=0;r[1]=0;r[2]=1;r[3]=0;break;case '3':r[0]=0;r[1]=0;r[2]=1;r[3]=1;break;case '4':r[0]=0;r[1]=1;r[2]=0;r[3]=0;break;case '5':r[0]=0;r[1]=1;r[2]=0;r[3]=1;break;case '6':r[0]=0;r[1]=1;r[2]=1;r[3]=0;break;case '7':r[0]=0;r[1]=1;r[2]=1;r[3]=1;break;case '8':r[0]=1;r[1]=0;r[2]=0;r[3]=0;break;case '9':r[0]=1;r[1]=0;r[2]=0;r[3]=1;break;case 'A':r[0]=1;r[1]=0;r[2]=1;r[3]=0;break;case 'B':r[0]=1;r[1]=0;r[2]=1;r[3]=1;break;case 'C':r[0]=1;r[1]=1;r[2]=0;r[3]=0;break;case 'D':r[0]=1;r[1]=1;r[2]=0;r[3]=1;break;case 'E':r[0]=1;r[1]=1;r[2]=1;r[3]=0;break;case 'F':r[0]=1;r[1]=1;r[2]=1;r[3]=1;break;}}int Csize(char *c){     //输入的16进制字符串长度 int i=0;for(;c[i]!='\0';i++);return i;}void Put2_8(int *array,int s,int n,int l){int t;for(int i=s;i<n-2;){t = array[i]*4 + array[i+1]*2 + array[i+2];if(l == 0){if(t != 0)printf("%d",t);}else{printf("%d",t);l = 1;}i+=3;}printf("\n");}void Cheak2(int *array,int n){   //检查二进制数位数是否是3的整数倍 int l=0,y = n%3;       //y 2进制数位数对三取余  l 八进制数首位是否为0 if(y == 1){if(array[0] == 1){printf("%d",1);l=1;}}if(y == 2){l = array[0]*2 + array[1];if(l != 0)printf("%d",l);}Put2_8(array,y,n,l);     //调用转化输出函数}void fun(char *c16){int r16[4],array[21],tk;tk = Csize(c16);for(int i=0;i<tk;i++){Get16_2(c16[i],r16);for(int j=0;j<4;j++){array[i*4+j] = r16[j];}}Cheak2(array,tk*4);}int main() {int N;char c16[10][10];scanf("%d",&N);for(int i=0;i<N;i++)scanf("%s",c16[i]);for(int i=0;i<N;i++)fun(c16[i]);return 0;}


0 0