十六进制转化为八进制(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<string.h>
#include<ctype.h>

void reverse(char s[])    //字符串反转
{
    char t;
    int i,len;

    len=strlen(s);

    for(i=0;i<len/2;i++)
    {
        t=s[i];
        s[i]=s[len-1-i];
        s[len-1-i]=t;
    }
}

char hex[100010],bin[400010];		//十六进制   和二进制 

int main()
{
    int temp=0,i=0,j,n,x,ans;
 
	
	scanf("%d",&x);
	
	while(x--)
	{
    	scanf("%s",hex);		//输入一个十六进制的数 
		
		j=0;
		
		if(*hex=='0')			//因为没有前置零 所以如果十六进制为零,则输出零 
		{
			printf("0\n");
			continue;
		}
			
    	for(i=strlen(hex)-1;i>=0;i--)		//将十六进制转化为二进制 
    	{
    	    if(isdigit(hex[i]))				//将每一位转化为相应的数字 
    	        temp=hex[i]-'0';
     	   else
      	      temp=hex[i]-'7';
			
			ans=1;			//每一次ans初始化为 1 
			
			while(temp)		//将每一位十六进制的数转换为其二进制的逆置形式 如:D 的二进制是1101,但转化bin字符数组的逆置形式就是1011; 
			{
			   	bin[j++]=temp%2+'0';
			   	temp/=2;
			   	ans=0;
			}
			
			while(j%4!=0||ans)		//不足四位的用 0 补齐;ans的作用当temp的值为零时,上一个while循环不会被执行,但需要用四个 0 补上 
			{
				bin[j++]='0';
				if(j%4==0) ans=0;
			}
		}
		j--;
		//以上过程将十六进制转化为二进制的逆置形式 
		for(;bin[j]=='0';j--);		//倒数第一个不为零的数 
    	
		bin[++j]='\0';		//形成字符串,方便使用函数将其逆置为正常的二进制 
		
		reverse(bin);		//逆置 
		n=strlen(bin);		//判断有多少位 每三位转化为一位八进制的数 
	
		if(n%3==1)			//判断多出来几位 
			printf("%c",bin[0]);
		else if(n%3==2)
			printf("%d",(bin[0]-'0')*2+bin[1]-'0');
	
		for(i=n%3;i<n;i+=3)
			printf("%d",(bin[i]-'0')*4+(bin[i+1]-'0')*2+bin[i+2]-'0');		//每三位转化为一位八进制的数 
	
		printf("\n");
	}
    return 0;
}

 

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值