鱼C论坛

 找回密码
 立即注册
查看: 1115|回复: 2

[已解决]进制转换十进制转二进制(包括小数)

[复制链接]
发表于 2020-12-23 11:15:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一世轻尘 于 2020-12-23 13:47 编辑

如下
最佳答案
2020-12-23 16:08:42
本帖最后由 jackz007 于 2020-12-23 16:20 编辑
  1. #include <stdio.h>

  2. //字符串倒序
  3. void reverse(char s[])
  4. {
  5.         char c                                                                  ;
  6.         int i , m                                                               ;
  7.         for(m = 0 ; s[m] ; m ++)                                                ;
  8.         for(i = 0 ; i < m / 2 ; i ++) {
  9.                 c = s[m - 1 - i]                                                ;
  10.                 s[m - 1 - i] = s[i]                                             ;
  11.                 s[i] = c                                                        ;
  12.         }
  13. }

  14. // 从字符串 s 中按进制数 x(2 - 16)提取浮点数
  15. float fromx(char s[] , int x)
  16. {
  17.         char c                                                                  ;
  18.         int f , i , j , m                                                       ;
  19.         float e , r                                                             ;
  20.         const char b[] = {"0123456789abcdef"}                                   ;
  21.         r = 0                                                                   ;
  22.         if(x <= 16) {
  23.                 for(m = 0 ; s[m] ; m ++)                                        ;
  24.                 for(f = 1 , r = i = 0 ; i < m && s[i] != '.' && f ; i ++) {
  25.                         c = s[i]                                                ;
  26.                         if(c >= 'A' && c <= 'F') c += ' '                       ;
  27.                         for(j = 0 ; j < x ; j ++) if(c == b[j]) break           ;
  28.                         if(j < x) {
  29.                                 r = r * x + j                                   ;
  30.                         } else {
  31.                                 r = f = 0                                       ;
  32.                                 break                                           ;
  33.                         }
  34.                 }
  35.                 if(f) {
  36.                         for(e = 1.0 / x , i ++ ; i < m ; e /= x , i ++) {
  37.                                 c = s[i]                                        ;
  38.                                 if(c >= 'A' && c <= 'F') c += ' '               ;
  39.                                 for(j = 0 ; j < x ; j ++) if(c == b[j]) break   ;
  40.                                 if(j < x) {
  41.                                         r = r + j * e                           ;
  42.                                 } else {
  43.                                         r = f = 0                               ;
  44.                                 }
  45.                         }
  46.                 }
  47.         }
  48.         return r                                                                ;
  49. }

  50. // 将浮点数 z 转换为 x (2 - 16)进制字符串输出到字符串 t 中
  51. char * tox(char t[] , float z , int x)
  52. {
  53.         const char b[] = {"0123456789abcdef"}                                   ;
  54.         int d , i , m                                                           ;
  55.         float f , r                                                             ;
  56.         t[0] = '\0'                                                             ;
  57.         if(x <= 16) {
  58.                 d = z                                                           ;
  59.                 f = z - d                                                       ;
  60.                 for(i = 0 ; d ; d /= x , i ++) t[i] = b[d % x]                  ;
  61.                 t[i] = '\0'                                                     ;
  62.                 reverse(t)                                                      ;
  63.                 if(f >= 0.000001) {
  64.                         if(! i) t[i ++] = '0'                                   ;
  65.                         t[i ++] = '.'                                           ;
  66.                         for(; f >= 0.000001 ; i ++) {
  67.                                 r = f * x                                       ;
  68.                                 d = r                                           ;
  69.                                 t[i] = b[d]                                     ;
  70.                                 f = r - d                                       ;
  71.                         }
  72.                         t[i] = '\0'                                             ;
  73.                 }
  74.         }        
  75.         return t                                                                ;
  76. }

  77. int main(void)
  78. {
  79.         char s[256] , t[256] , bin[256] , oct[256] , hex[256] ;
  80.         int d                                                 ;
  81.         float f                                               ;
  82.         printf("键入十进制数:")                              ;
  83.         scanf("%d" , & d)                                     ;
  84.         printf("bin : %s\n" , tox(bin , d , 2))               ;
  85.         printf("oct : %s\n" , tox(oct , d , 8))               ;
  86.         printf("hex : %s\n" , tox(hex , d , 16))              ;
  87.         printf("键入十进制数:")                              ;
  88.         scanf("%f" , & f)                                     ;
  89.         printf("bin : %s\n" , tox(bin , f , 2))               ;
  90.         printf("oct : %s\n" , tox(oct , f , 8))               ;
  91.         printf("hex : %s\n" , tox(hex , f , 16))              ;
  92.         printf("键入二进制数:")                              ;
  93.         scanf("%s" , bin)                                     ;
  94.         printf("dec : %.0f\n" , fromx(bin , 2))               ;
  95.         printf("键入二进制数:")                              ;
  96.         scanf("%s" , bin)                                     ;
  97.         printf("dec : %f\n" , fromx(bin , 2))                 ;
  98.         printf("键入二进制数:")                              ;
  99.         scanf("%s" , s)                                       ;
  100.         printf("bin : %s\n" , tox(t , fromx(s , 2) , 2))      ;
  101.         printf("qua : %s\n" , tox(t , fromx(s , 2) , 4))      ;
  102.         printf("oct : %s\n" , tox(t , fromx(s , 2) , 8))      ;
  103.         printf("dec : %s\n" , tox(t , fromx(s , 2) , 10))     ;
  104.         printf("hex : %s\n" , tox(t , fromx(s , 2) , 16))     ;
  105.         printf("键入十六进制数:")                            ;
  106.         scanf("%s" , s)                                       ;
  107.         printf("bin : %s\n" , tox(t , fromx(s , 16) , 2))     ;
  108.         printf("qua : %s\n" , tox(t , fromx(s , 16) , 4))     ;
  109.         printf("oct : %s\n" , tox(t , fromx(s , 16) , 8))     ;
  110.         printf("dec : %s\n" , tox(t , fromx(s , 16) , 10))    ;
  111.         printf("hex : %s\n" , tox(t , fromx(s , 16) , 16))    ;
  112. }
复制代码

        编译、运行实况:
  1. D:\0002.Exercise\C>g++ -o fx2 fx2.c

  2. D:\0002.Exercise\C>fx2
  3. 键入十进制数:235
  4. bin : 11101011
  5. oct : 353
  6. hex : eb
  7. 键入十进制数:0.2357910
  8. bin : 0.0011110001011100110011001
  9. oct : 0.170563144
  10. hex : 0.3c5ccc8
  11. 键入二进制数:10101101
  12. dec : 173
  13. 键入二进制数:0.1110011
  14. dec : 0.898438
  15. 键入二进制数:11101101
  16. bin : 11101101
  17. qua : 3231
  18. oct : 355
  19. dec : 237
  20. hex : ed
  21. 键入十六进制数:12Def
  22. bin : 10010110111101111
  23. qua : 102313233
  24. oct : 226757
  25. dec : 77295
  26. hex : 12def

  27. D:\0002.Exercise\C>
复制代码


        如你所见,这个程序可以对正的浮点数在 2 ~16 进制数之间任意转换。

        最后一个样例就是十六进制 12Def 的那一个,四进制数 1023233233 是错误的。正确的值应该是 102313233
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-23 16:08:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-12-23 16:20 编辑
  1. #include <stdio.h>

  2. //字符串倒序
  3. void reverse(char s[])
  4. {
  5.         char c                                                                  ;
  6.         int i , m                                                               ;
  7.         for(m = 0 ; s[m] ; m ++)                                                ;
  8.         for(i = 0 ; i < m / 2 ; i ++) {
  9.                 c = s[m - 1 - i]                                                ;
  10.                 s[m - 1 - i] = s[i]                                             ;
  11.                 s[i] = c                                                        ;
  12.         }
  13. }

  14. // 从字符串 s 中按进制数 x(2 - 16)提取浮点数
  15. float fromx(char s[] , int x)
  16. {
  17.         char c                                                                  ;
  18.         int f , i , j , m                                                       ;
  19.         float e , r                                                             ;
  20.         const char b[] = {"0123456789abcdef"}                                   ;
  21.         r = 0                                                                   ;
  22.         if(x <= 16) {
  23.                 for(m = 0 ; s[m] ; m ++)                                        ;
  24.                 for(f = 1 , r = i = 0 ; i < m && s[i] != '.' && f ; i ++) {
  25.                         c = s[i]                                                ;
  26.                         if(c >= 'A' && c <= 'F') c += ' '                       ;
  27.                         for(j = 0 ; j < x ; j ++) if(c == b[j]) break           ;
  28.                         if(j < x) {
  29.                                 r = r * x + j                                   ;
  30.                         } else {
  31.                                 r = f = 0                                       ;
  32.                                 break                                           ;
  33.                         }
  34.                 }
  35.                 if(f) {
  36.                         for(e = 1.0 / x , i ++ ; i < m ; e /= x , i ++) {
  37.                                 c = s[i]                                        ;
  38.                                 if(c >= 'A' && c <= 'F') c += ' '               ;
  39.                                 for(j = 0 ; j < x ; j ++) if(c == b[j]) break   ;
  40.                                 if(j < x) {
  41.                                         r = r + j * e                           ;
  42.                                 } else {
  43.                                         r = f = 0                               ;
  44.                                 }
  45.                         }
  46.                 }
  47.         }
  48.         return r                                                                ;
  49. }

  50. // 将浮点数 z 转换为 x (2 - 16)进制字符串输出到字符串 t 中
  51. char * tox(char t[] , float z , int x)
  52. {
  53.         const char b[] = {"0123456789abcdef"}                                   ;
  54.         int d , i , m                                                           ;
  55.         float f , r                                                             ;
  56.         t[0] = '\0'                                                             ;
  57.         if(x <= 16) {
  58.                 d = z                                                           ;
  59.                 f = z - d                                                       ;
  60.                 for(i = 0 ; d ; d /= x , i ++) t[i] = b[d % x]                  ;
  61.                 t[i] = '\0'                                                     ;
  62.                 reverse(t)                                                      ;
  63.                 if(f >= 0.000001) {
  64.                         if(! i) t[i ++] = '0'                                   ;
  65.                         t[i ++] = '.'                                           ;
  66.                         for(; f >= 0.000001 ; i ++) {
  67.                                 r = f * x                                       ;
  68.                                 d = r                                           ;
  69.                                 t[i] = b[d]                                     ;
  70.                                 f = r - d                                       ;
  71.                         }
  72.                         t[i] = '\0'                                             ;
  73.                 }
  74.         }        
  75.         return t                                                                ;
  76. }

  77. int main(void)
  78. {
  79.         char s[256] , t[256] , bin[256] , oct[256] , hex[256] ;
  80.         int d                                                 ;
  81.         float f                                               ;
  82.         printf("键入十进制数:")                              ;
  83.         scanf("%d" , & d)                                     ;
  84.         printf("bin : %s\n" , tox(bin , d , 2))               ;
  85.         printf("oct : %s\n" , tox(oct , d , 8))               ;
  86.         printf("hex : %s\n" , tox(hex , d , 16))              ;
  87.         printf("键入十进制数:")                              ;
  88.         scanf("%f" , & f)                                     ;
  89.         printf("bin : %s\n" , tox(bin , f , 2))               ;
  90.         printf("oct : %s\n" , tox(oct , f , 8))               ;
  91.         printf("hex : %s\n" , tox(hex , f , 16))              ;
  92.         printf("键入二进制数:")                              ;
  93.         scanf("%s" , bin)                                     ;
  94.         printf("dec : %.0f\n" , fromx(bin , 2))               ;
  95.         printf("键入二进制数:")                              ;
  96.         scanf("%s" , bin)                                     ;
  97.         printf("dec : %f\n" , fromx(bin , 2))                 ;
  98.         printf("键入二进制数:")                              ;
  99.         scanf("%s" , s)                                       ;
  100.         printf("bin : %s\n" , tox(t , fromx(s , 2) , 2))      ;
  101.         printf("qua : %s\n" , tox(t , fromx(s , 2) , 4))      ;
  102.         printf("oct : %s\n" , tox(t , fromx(s , 2) , 8))      ;
  103.         printf("dec : %s\n" , tox(t , fromx(s , 2) , 10))     ;
  104.         printf("hex : %s\n" , tox(t , fromx(s , 2) , 16))     ;
  105.         printf("键入十六进制数:")                            ;
  106.         scanf("%s" , s)                                       ;
  107.         printf("bin : %s\n" , tox(t , fromx(s , 16) , 2))     ;
  108.         printf("qua : %s\n" , tox(t , fromx(s , 16) , 4))     ;
  109.         printf("oct : %s\n" , tox(t , fromx(s , 16) , 8))     ;
  110.         printf("dec : %s\n" , tox(t , fromx(s , 16) , 10))    ;
  111.         printf("hex : %s\n" , tox(t , fromx(s , 16) , 16))    ;
  112. }
复制代码

        编译、运行实况:
  1. D:\0002.Exercise\C>g++ -o fx2 fx2.c

  2. D:\0002.Exercise\C>fx2
  3. 键入十进制数:235
  4. bin : 11101011
  5. oct : 353
  6. hex : eb
  7. 键入十进制数:0.2357910
  8. bin : 0.0011110001011100110011001
  9. oct : 0.170563144
  10. hex : 0.3c5ccc8
  11. 键入二进制数:10101101
  12. dec : 173
  13. 键入二进制数:0.1110011
  14. dec : 0.898438
  15. 键入二进制数:11101101
  16. bin : 11101101
  17. qua : 3231
  18. oct : 355
  19. dec : 237
  20. hex : ed
  21. 键入十六进制数:12Def
  22. bin : 10010110111101111
  23. qua : 102313233
  24. oct : 226757
  25. dec : 77295
  26. hex : 12def

  27. D:\0002.Exercise\C>
复制代码


        如你所见,这个程序可以对正的浮点数在 2 ~16 进制数之间任意转换。

        最后一个样例就是十六进制 12Def 的那一个,四进制数 1023233233 是错误的。正确的值应该是 102313233
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 23:30:53 | 显示全部楼层
已解决
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-4 06:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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