华为机试 - 5 进制转换

进制转换

http://www.nowcoder.com/questionTerminal/8f3df50d2b9043208c5eed283d1d4da6

题目描述

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入 )

输入描述:

输入一个十六进制的数值字符串。

输出描述:

输出该数值的十进制字符串。

示例1
输入

0xA

输出

10

题解

1. 数学上对进制转换

0xabcd = a16^3 + b16^2 +c161 +d160
如果看成一个数组来存储,则在数组里对顺序与幂的大小成相反关系。
index = len-1时,幂=0;
index = 2时,幂 = len -3

2. 求字符串长度len.

3. 考虑字符可能的三种情况,分别计算出对应的十进制数digit

这里通过字符串想减,将十六进制位转换位十进制。

4.计算对应的sum = pow(16,j)*digit

5.输出结果

6. c语言实现

#include <stdio.h>
#include <math.h>
int main()
{
    //1. 输入处理
    char num[100];

    while (scanf("%s",num) != EOF) {

        //2. 进制转换
        int sum=0;
        int len = 0;
        while (num[len] != '\0') {
            len++;
        }

        for (int i = len-1,j=0 ; i>=2 && j<len-2; i--,j++) { //不包含开头0x
            int digit=0;
            if (num[i] >='A' && num[i] <='F') {
                digit = num[i] - 'A' +10;
            }
            else if (num[i] >='a' && num[i] <='f')
            {
                digit = num[i] -'a' +10;
            }
            else
            {
                digit = num[i]-'0';
            }
            sum += pow(16,j)*digit;
        }
        //3. 输出处理
        printf("%d\n",sum);
    }
    return 0;
}
全部评论
不进行16进制数输入校验,输入有误还继续处理?
点赞 回复
分享
发布于 2020-04-01 13:54

相关推荐

5 4 评论
分享
牛客网
牛客企业服务