蓝桥杯基础练习题十六进制转八进制

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值