【C语言】十六进制转换为十进制

目录

题目描述

补充知识:

算法分析

优化算法

写在最后


题目描述

输入一个十六进制数字串,将其转换成为对应的整数并输出转换结果,遇到非十六进制数字字符串结束符('\0'结束转换。

注意: 输入的字符串的长度不会超过100;转换后的值不会超出int类型的范围。

1.测试输入:55 //程序的输入不会有十六进制的前缀

   预期输出:85

2.测试输入:f1r2 //程序的输入不会有十六进制的前缀

   预期输出:241

补充知识:

十六进制转换为十进制的做法:

【C语言】十六进制转换为十进制_第1张图片

算法分析

#include
#include
void conversion(char str[]){
	/**********  Begin  **********/
    int i=0,j=0,num=0,sum=0;
    int len=strlen(str);

    while(str[i]!='\0')
    {
        if(str[i]>='0'&&str[i]<='9')
           num=str[i]-'0';
        else if(str[i]>='a'&&str[i]<='f')
           num=str[i]-'a'+10;
        else if(str[i]>='A'&&str[i]<='F')
           num=str[i]-'A'+10; 
        else
           break;
        for(j=0;j

上面代码不够完善,当遇到一些特殊情况(当出现非16进制的字符的时候)就会出错,例如:

测试输入:5r //程序的输入不会有十六进制的前缀

预期输出:5

实际输出:80

问题在于:

  • 我们使用字符的长度n(程序中以len代替)来决定 5*16^{n},r也被记录在内,导致多乘了一个16。
  • 而且对循环的结束条件设置的不合理,如果输入的例子为5r123,那么就会被计算为5*16^{5}

优化算法

#include
#include
void conversion(char str[]) 
{
    /**********  Begin  **********/
    int i = 0, j=0,num = 0, sum = 0,len=0;
    //int len = strlen(str);//这种方法会将非16进制数记录在内
    while ((str[i] >= 'a' && str[i] <= 'f') || (str[i] >= 'A' && str[i] <= 'F') || (str[i] >= '0' && str[i] <= '9'))
    {
        len++;
        i++;
    } //遍历数组记录16进制数的个数,非16进制数不计在内 
    i = 0;
    while (str[i] != '\0')
    {
        //字符转数字
        if (str[i] >= '0' && str[i] <= '9')
            num = str[i] - '0';
        else if (str[i] >= 'a' && str[i] <= 'f')
            num = str[i] - 'a' + 10;
        else if (str[i] >= 'A' && str[i] <= 'F')
            num = str[i] - 'A' + 10;
        else
            break;//遇到'\0'之前的第一个非十六进制数就停止循环
        for (j = 0; j < len - 1; j++)
        {
            num = num * 16;
        }
        sum += num;
        i++;
        len--;//每读取一位就使长度-1
    }
    printf("%d\n", sum);
    /**********  End  **********/
}

写在最后

点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论,你的意见是我进步的财富!

你可能感兴趣的:(#,C语言基础,c语言)