【ZCMU2158】ly的进制转换

本文介绍了一种算法,该算法用于解决从16进制数转换为8进制数的问题,适用于多组数据的批量转换。通过先将16进制数转换为二进制数,再转换为8进制数,解决了直接转换的复杂性。文章提供了详细的C语言实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击打开链接

 

2158: G.ly的进制转换

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 72  Solved: 26
[Submit][Status][Web Board]

Description

ly去年有门课叫C语言基础,今年的期末考试上有一道题目是"将16进制的数字39转换成八进制",但是ly并不会算...
在去年考完试之后,发奋学习,并且只学习怎么把16进制的数字转换成八进制...
今年的java考试刚好也有这个问题,但是ly缺忘了怎么算...所以你能帮她吗?

 

Input

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

 

Output

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

 

Sample Input

139

Sample Output

71

HINT

 

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

 

Source

jnxxhzz

 

解题思路:

本题采用的是将十六进制数先转化为二进制数,再将二进制数抓换成八进制数的方法。

为了使计算更方便,将十六进制数转化成二进制数时应将二进制数倒置,然后每3个二进制数一组转换成八进制数存入数组中。最后有个小细节的问题,输出是开头不能出现0,因为数组中的八进制数是经过翻转的,所以输出只需判断最后一个数字是否为0,若为0不输出,反之输出。

代码:

#include<stdio.h>
#include<string.h>
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        int j,x,k,len=0;
        char hex[100002],b[400002],s[400002];
        scanf("%s",hex);
        int l=strlen(hex);
        for(j=l-1;j>=0;j--){
            if(hex[j]-'0'>=0 && '9'-hex[j]>=0){
                x=hex[j]-'0';
            }
            else x=hex[j]-'A'+10;
            for(k=0;k<4;k++){
                b[len++]=x%2+'0';
                x=x/2;
            }
        }
        b[len]='\0';
        //for(i=0;i<len;i++)printf("%c",b[i]);
        int y=0,a=1,t=0;
        for(j=0;j<len;j++){
            if(a>=4 || j==len-1){
                y=(b[j]-'0')*a+y;
                s[t++]=y+'0';
                a=1;
                y=0;                
            }
            else{
                y=(b[j]-'0')*a+y;
                a=a*2;
            }
        }
        for(j=t-1;j>=0;j--){
            if(j==t-1 && s[t-1]=='0')continue;
            else printf("%c",s[j]);
        }
        printf("\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值