C练题笔记之:牛客-HJ005. 进制转换

题目:

描述:写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。

输入描述:输入一个十六进制的数值字符串。注意:一个用例会同时有多组输入数据,请参考帖子https://www.nowcoder.com/discuss/276处理多组输入的问题。

输出描述:输出该数值的十进制字符串。不同组的测试用例用\n隔开。

示例1

输入:

0xA
0xAA

复制输出:

10
170

结果:

方法一:(直接直接用输入输出格式化处理)

方法二:(按照题目要求用字符串处理)

解题思路:

方法一:(直接直接用输入输出格式化处理)

        这个方法有点投机取巧。

        既然是十六进制转换十进制。

       那么scanf格式化输入的时候按照十六进制获取。

       然后在printf格式化输出的时候按照十进制输出即可。

       emm。。就是投机取巧,并不是按照题目处理字符串

方法二:(按照题目要求用字符串处理)

       1,首先获取1个字符串。

       2,从末尾开始获取数值。(注意循环获取的时候,前两个字符是0x所以不需要计算)

       3,将每一个字母分为大写的A~F和小写a~f,以及0~9。从而先将当前位数的转换为十进制。

       4,通过当前获取的位是字符串的 len - i位,计算出是十六进制的第len - i位。从而乘以16的len-i次方。

       5,将获取的每个位的十进制相加。

代码:

方法一:(直接直接用输入输出格式化处理)

#include <stdio.h>

int main() {
    int hex, dec;
    while(scanf("%x", &hex) != EOF) {
        printf("%d\n", hex);
    }
    return 0;
}

方法二:(按照题目要求用字符串处理)

#include <stdio.h>
#include <string.h>

int main() {
    char hex[1024] = {};
    while(scanf("%s", hex) != EOF) {
        int len = strlen(hex);
        int dec = 0;
        //循环读取每一位
        for(int i = len; i > 2; i--) {
            char chr = hex[i-1];
            int temp = 0;
            //将每一位转换为十进制(只需区分a~z或者A~Z或者0~9即可
            if(chr >= 'a') {
                temp = chr - 'a' + 10;
            }
            else if(chr < 'A') {
                temp = chr - '0';
            }
            else {
                temp = chr - 'A' + 10;
            }
            //通过循环对当前位获得16的次方
            for(int j = len - i; j > 0; j--) {
                temp = temp * 16;
            }
            dec += temp;
        }
        printf("%d\n", dec);
        memset(hex, '\n', 1024);
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值