码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【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. }

    写在最后

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

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

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

  • 相关阅读:
    论文解读(NGCF)《LightGCN: Simplifying and Powering Graph Convolution Network for Recommendation》
    深入Linux:权限管理与常用命令详解
    成人自考-英语二-形容词
    洛谷 P5306 [COCI2019] Transport 题解
    UE5编译报错:Error MSB3073
    物联网的未来:连接的智能世界
    如何处理前端响应式图片?
    数据结构入门(C语言版)图的概念和功能函数实现
    植物内生细菌——降解石油污染的新方向!
    web前端期末大作业:JavaScript大作业——福五鼠动漫网页制作(6页)带轮播图效果 学生个人单页面网页作业 学生网页设计成品 静态HTML网页单页制作
  • 原文地址:https://blog.csdn.net/m0_73222051/article/details/128065456
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号