16进制转8进制

给定n个十六进制正整数,输出他们对应的八进制数。(注: 编写函数,先将十六进制转化为二进制,再转化为八进制,最后输出)

      输入格式:


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

输出格式:

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

注意:

输入的十六进制数不会有前导0,比如012A。

输出的八进制数也不能有前导0.

样例输入:

2
39
123ABC

样例输出:

71
4435274

最开始没有仔细读题,思路很常规,就是16进制先转化为10进制,然后10进制数转化为8进制数。代码如下:

#include<stdio.h>
#include<string.h>
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        char a[100005];
        scanf("%s",a);
        int l,i,k,ans[200005],t;
        long long int c=0;
        l=strlen(a);
        for(i=0;i<l;i++)
        {
            if(a[i]>='0'&&a[i]<='9')
                c=c*16+a[i]-48;
            else
                c=c*16+a[i]-55;
        }
       // printf("%lld",c);
        t=0;
        while(c!=0)
        {
            k=c%8;
            ans[t]=k;
            c/=8;
            t++;
        }
        for(i=t-1;i>=0;i--)
            printf("%d",ans[i]);
        printf("\n");
    }
    return 0;
}

但是后来发现题意是16进制直接转2进制,然后2进制转8进制。

思路是16进制的每一个数是2进制的连续4个数组成,然后3个连续的2进制数是一个8进制数。

由此,代码如下:

#include<stdio.h>
#include<string.h>
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        char a[100005];
        int b[400005];
        scanf("%s",a);
        int l,i,k,t,d,j=0,s=0;
        l=strlen(a);
        memset(b,0,sizeof b);
        int h,m;
        for(i=l-1;i>=0;i--)
        {
            h=0;
            if(a[i]>='0'&&a[i]<='9')
                k=a[i]-48;
            else
                k=a[i]-55;
            while(k!=0)
            {
                t=k%2;
                b[4*s+h]=t;
                k/=2;
                h++;
            }
            s++;
        }
        m=4*(s-1)+h;
        //16进制转2进制
       /* for(i=m-1;i>=0;i--)
           printf("%d",b[i]);
        printf("\n");
        */
        if(m%3==0)
            d=m+2;
        else if(m%3==1)
            d=m+1;
        else
            d=m-1;
        for(i=d;i>=2;i-=3)
        {
            j=b[i-2]+2*b[i-1]+4*b[i];
            if(i==d&&j==0)continue;
            printf("%d",j);
        }
        //2进制转8进制
        printf("\n");
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值