鱼C论坛

 找回密码
 立即注册
查看: 1996|回复: 9

[已解决]十六进制转十进制问题

[复制链接]
发表于 2018-3-18 10:46:07 | 显示全部楼层 |阅读模式
10鱼币
为啥的出的结果比正确的结果少  3  呢,不求甚解
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <string.h>

  4. //输入十六进制数,转换成十进制

  5. #define MAX 30

  6. int hex(char array[]);        //进制转换

  7. int main(void)
  8. {
  9.         char number[MAX];        //存放合法的十六进制数字
  10.        
  11.         printf("请输入一个十六进制数:");
  12.         scanf("%s", number);       
  13.                                
  14.         printf("十六进制的 %s 转换成十进制为 %d \n", number, hex(number));
  15.                
  16.        
  17.        
  18.         getch();
  19.         return 0;
  20. }

  21. int hex(char array[MAX])
  22. {
  23.         int i, j;                //循环变量
  24.         int sum = 0;        //获取最终结果
  25.         int len;                //获取该数组的长度
  26.         int  temp;                //获取每个字符的转换成十进制后的值
  27.        
  28.         len = strlen(array);
  29.        
  30.         for(i = len, j = 0; i >= 0; i--, j++)
  31.         {
  32.                 if(array[i] <= '9')
  33.                 {
  34.                         temp = array[i] - '0';
  35.                 }
  36.                 else if(array[i] >= 'A' && array[i] <= 'Z')
  37.                 {
  38.                         temp = array[i] - 'A' + 10;
  39.                 }
  40.                 else if(array[i] >= 'a' && array[i] <= 'z')
  41.                 {
  42.                         temp = array[i] - 'a' + 10;
  43.                 }
  44.                
  45.                  sum +=  temp*(pow(16, j-1));
  46.         }
  47.        
  48.         return sum;
  49. }
复制代码
最佳答案
2018-3-18 10:46:08
嗯嗯知道了 ,你在第50行 pow函数的返回值是double型的 你在前面加一个(int)把他转化为int型就不会出错了
另外 主函数里的getch()应该是多余的
另外建议楼主输入十六进制数以0xff这样比较规范, 传字符数组的时候只要传向后两位的指针就可以了

最佳答案

查看完整内容

嗯嗯知道了 ,你在第50行 pow函数的返回值是double型的 你在前面加一个(int)把他转化为int型就不会出错了 另外 主函数里的getch()应该是多余的 另外建议楼主输入十六进制数以0xff这样比较规范, 传字符数组的时候只要传向后两位的指针就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-18 10:46:08 | 显示全部楼层    本楼为最佳答案   
嗯嗯知道了 ,你在第50行 pow函数的返回值是double型的 你在前面加一个(int)把他转化为int型就不会出错了
另外 主函数里的getch()应该是多余的
另外建议楼主输入十六进制数以0xff这样比较规范, 传字符数组的时候只要传向后两位的指针就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-18 12:07:12 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <string.h>

  4. //输入十六进制数,转换成十进制

  5. #define MAX 30

  6. int hex(char array[]);        //进制转换

  7. int main(void)
  8. {
  9.         char number[MAX];        //存放合法的十六进制数字
  10.         
  11.         printf("请输入一个十六进制数:");
  12.         scanf("%s", number);        
  13.                                 
  14.         printf("十六进制的 %s 转换成十进制为 %d \n", number, hex(number));
  15.                
  16.         
  17.         
  18.         getch();
  19.         return 0;
  20. }

  21. int hex(char array[MAX])
  22. {
  23.         int i, j;                //循环变量
  24.         int sum = 0;        //获取最终结果
  25.         int len;                //获取该数组的长度
  26.         int  temp;                //获取每个字符的转换成十进制后的值

  27.         len = strlen(array);
  28.         
  29.         for(i = len-1, j=0; i >= 0; i--, j++)
  30.         {
  31.                 if(array[i] <= '9')
  32.                 {
  33.                         temp = array[i] - '0';

  34.                 }
  35.                 else if(array[i] >= 'A' && array[i] <= 'F')
  36.                 {
  37.                         temp = array[i] - 'A' + 10;

  38.                 }
  39.                 else if(array[i] >= 'a' && array[i] <= 'f')
  40.                 {
  41.                         temp = array[i] - 'a' + 10;

  42.                 }
  43.                

  44.                  sum += temp*pow(16, j);
  45.         }
  46.         
  47.         return sum;
  48. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-18 12:10:55 From FishC Mobile | 显示全部楼层
j从0开始循环,第50行指数为什么是j-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-18 14:39:09 | 显示全部楼层
楼主输入什么 少3?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-19 08:17:37 From FishC Mobile | 显示全部楼层
BngThea 发表于 2018-3-18 12:10
j从0开始循环,第50行指数为什么是j-1

俺这里不减的话会多乘一次,结果差距好大的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-19 12:41:52 | 显示全部楼层
Dr丶温 发表于 2018-3-19 08:17
俺这里不减的话会多乘一次,结果差距好大的。。
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>

  4. //输入十六进制数,转换成十进制

  5. #define MAX 30

  6. int hex(char array[]);        //进制转换

  7. int main(void)
  8. {
  9.         //char number[MAX];        //存放合法的十六进制数字

  10.         //printf("请输入一个十六进制数:");
  11.         //scanf("%s", number);


  12.         char number[MAX] = "9FFFF";
  13.         printf("十六进制的 %s 转换成十进制为 %d \n", number, hex(number));



  14. //        getch();
  15.         return 0;
  16. }

  17. //int hex(char array[MAX])
  18. //{
  19. //        int i, j;                //循环变量
  20. //        int sum = 0;        //获取最终结果
  21. //        int len;                //获取该数组的长度
  22. //        int  temp;                //获取每个字符的转换成十进制后的值
  23. //
  24. //        len = strlen(array);
  25. //
  26. //        for(i = len, j = 0; i >= 0; i--, j++)
  27. //        {
  28. //                if(array[i] <= '9')
  29. //                {
  30. //                        temp = array[i] - '0';
  31. //                }
  32. //                else if(array[i] >= 'A' && array[i] <= 'Z')
  33. //                {
  34. //                        temp = array[i] - 'A' + 10;
  35. //                }
  36. //                else if(array[i] >= 'a' && array[i] <= 'z')
  37. //                {
  38. //                        temp = array[i] - 'a' + 10;
  39. //                }
  40. //
  41. //                sum += temp * (pow(16, j - 1));
  42. //        }
  43. //
  44. //        return sum;
  45. //}


  46. int hex(char array[MAX])
  47. {
  48.         int len = strlen(array);
  49.         int sum = 0;
  50.         int temp;

  51.         for(int i = 0; i < len; ++i)
  52.         {
  53.                 if(isdigit(array[i]))
  54.                 {
  55.                         temp = array[i] - '0';
  56.                 }
  57.                 else if(isupper(array[i]))
  58.                 {
  59.                         temp = array[i] - 'A' + 10;
  60.                 }
  61.                 else
  62.                 {
  63.                         temp = array[i] - 'a' + 10;
  64.                 }

  65.                 sum = sum * 16 + temp;
  66.         }

  67.         return sum;
  68. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-19 20:14:28 | 显示全部楼层

真是多谢代码啦,不过感觉用自己脑洞的基础上再深入好些
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-19 20:18:50 | 显示全部楼层

还可以酱紫改!!!!!
长知识了,谢谢哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-19 20:19:24 | 显示全部楼层
t6am3 发表于 2018-3-18 14:41
嗯嗯知道了 ,你在第50行 pow函数的返回值是double型的 你在前面加一个(int)把他转化为int型就不会出错了 ...

感谢答疑,懂了一半了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 01:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表