• 【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. }

    写在最后

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

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

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

  • 相关阅读:
    Blazor前后端框架Known-V1.2.1
    数字孪生变电站如何制作?虚拟现实项目强荐广州华锐互动
    基于ARM的字符串拷贝实验(嵌入式系统)
    基于token的多平台身份认证架构设计
    Python案例|使用Scikit-learn进行房屋租金回归分析
    用 flink 插件chunjun实现全量+增量同步-达梦数据库到postgresql
    【JS】变量与数据类型,this
    国内类似ChatGPT的大模型应用有哪些?发展情况如何了
    pdf怎么转换成ppt?不要错过本篇文章
    基于docker快速搭建facechain环境
  • 原文地址:https://blog.csdn.net/m0_73222051/article/details/128065456