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


    目录

    题目描述

    补充知识:

    算法分析

    优化算法

    写在最后


    题目描述

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

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

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

       预期输出:85

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

       预期输出:241

    补充知识:

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

    算法分析

    1. #include
    2. #include
    3. void conversion(char str[]){
    4. /********** Begin **********/
    5. int i=0,j=0,num=0,sum=0;
    6. int len=strlen(str);
    7. while(str[i]!='\0')
    8. {
    9. if(str[i]>='0'&&str[i]<='9')
    10. num=str[i]-'0';
    11. else if(str[i]>='a'&&str[i]<='f')
    12. num=str[i]-'a'+10;
    13. else if(str[i]>='A'&&str[i]<='F')
    14. num=str[i]-'A'+10;
    15. else
    16. break;
    17. for(j=0;j-1;j++)
    18. {
    19. num=num*16;
    20. }
    21. sum+=num;
    22. i++;
    23. len--;
    24. }
    25. printf("%d",sum);
    26. /********** End **********/
    27. }

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

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

    预期输出:5

    实际输出:80

    问题在于:

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

    优化算法

    1. #include
    2. #include
    3. void conversion(char str[])
    4. {
    5. /********** Begin **********/
    6. int i = 0, j=0,num = 0, sum = 0,len=0;
    7. //int len = strlen(str);//这种方法会将非16进制数记录在内
    8. while ((str[i] >= 'a' && str[i] <= 'f') || (str[i] >= 'A' && str[i] <= 'F') || (str[i] >= '0' && str[i] <= '9'))
    9. {
    10. len++;
    11. i++;
    12. } //遍历数组记录16进制数的个数,非16进制数不计在内
    13. i = 0;
    14. while (str[i] != '\0')
    15. {
    16. //字符转数字
    17. if (str[i] >= '0' && str[i] <= '9')
    18. num = str[i] - '0';
    19. else if (str[i] >= 'a' && str[i] <= 'f')
    20. num = str[i] - 'a' + 10;
    21. else if (str[i] >= 'A' && str[i] <= 'F')
    22. num = str[i] - 'A' + 10;
    23. else
    24. break;//遇到'\0'之前的第一个非十六进制数就停止循环
    25. for (j = 0; j < len - 1; j++)
    26. {
    27. num = num * 16;
    28. }
    29. sum += num;
    30. i++;
    31. len--;//每读取一位就使长度-1
    32. }
    33. printf("%d\n", sum);
    34. /********** End **********/
    35. }

    写在最后

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

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

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

  • 相关阅读:
    [JAVA]排序
    不用Swagger,那我用啥?
    koa框架(一)
    【SemiDrive源码分析】【MailBox核间通信】43 - 基于Mailbox IPCC RPC 实现核间通信(代码实现篇)
    【深度学习】卷积层填充和步幅以及其大小关系
    十三届蓝桥杯B组国赛
    Mysql系列三:Innodb MVCC版本控制
    【完美世界】被骂国漫之耻,石昊人设战力全崩,现在真成恋爱世界了
    济南瞪羚企业申报流程,瞪羚企业认定标准-
    go语言中的文件file操作
  • 原文地址:https://blog.csdn.net/m0_73222051/article/details/128065456