十六进制转八进制

来源:互联网 发布:2016淘宝小号直销商 编辑:程序博客网 时间:2024/05/21 10:27

十六进制转八进制

时间限制:1.0s   内存限制:512.0MB

问题描述:给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

样例输入

2

39

123ABC

样例输出

71

4435274

提示:先将十六进制数转换成某进制数,再由某进制数转换成八进制。

代码如下:

/**十六进制转八进制进制之间的转换**/#include <stdio.h>#include <stdlib.h>#include <string.h>#define INF 100000000void sixt_change_eight();char *getinfo(int n);char *h=NULL ,*b=NULL,*e=NULL;int main() {    int n;scanf("%d",&n);while(n--){  char num[100002];   scanf("%s",num);  int length=strlen(num);  h=getinfo(length);  b=getinfo(4*length);   e=getinfo((4/3+1)*length);     h=num;//直接指向数组地址,运行时耗内存较少   //strcpy(h,num);//复制到数组时,内存稍微多一点   sixt_change_eight();   free(h);      free(b);          free(e);}return 0;}void sixt_change_eight(){  int i,len=0;  //十六进制转成二进制   for (i=strlen(h)-1;i>=0;i--)   {   int v;   if(h[i]>='0'&&h[i]<='9') v=h[i]-'0';   else v=h[i]-'A'+10;   int j;   for (j=0;j<4;j++)   {    b[len++]=v%2+'0';v/=2;   }  }  b[len]='\0';//在字符串后面加一个‘\0’,b[len]就是一个存贮二进制数组   //printf("len=%d\n",len);  int x=0,cnt=1,l=0;  //把二进制转换成八进制   for(i=0;i<len;i++)  {   if(cnt==4||i==len-1)    {   x=cnt*(b[i]-'0')+x;   cnt=1;   e[l++]=x+'0';   x=0;   }   else   {   x=cnt*(b[i]-'0')+x;   cnt*=2;   }  }  //printf("l=%d\n",l);      i=l-1;  while(i>=0&&e[i]=='0') i--;   if(i<0) printf("0");  for (;i>=0;i--)  {  printf("%c",e[i]);  }  printf("\n");}char *getinfo(int n){char *p=NULL;p=(char*)malloc(sizeof(char)*(n+1));if(NULL==p){exit(0);}return p;}


(全文完)

0 0