一世轻尘 发表于 2020-12-23 11:15:36

进制转换十进制转二进制(包括小数)

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

如下

jackz007 发表于 2020-12-23 16:08:42

本帖最后由 jackz007 于 2020-12-23 16:20 编辑

#include <stdio.h>

//字符串倒序
void reverse(char s[])
{
      char c                                                                  ;
      int i , m                                                               ;
      for(m = 0 ; s ; m ++)                                                ;
      for(i = 0 ; i < m / 2 ; i ++) {
                c = s                                                ;
                s = s                                             ;
                s = c                                                      ;
      }
}

// 从字符串 s 中按进制数 x(2 - 16)提取浮点数
float fromx(char s[] , int x)
{
      char c                                                                  ;
      int f , i , j , m                                                       ;
      float e , r                                                             ;
      const char b[] = {"0123456789abcdef"}                                 ;
      r = 0                                                                   ;
      if(x <= 16) {
                for(m = 0 ; s ; m ++)                                        ;
                for(f = 1 , r = i = 0 ; i < m && s != '.' && f ; i ++) {
                        c = s                                                ;
                        if(c >= 'A' && c <= 'F') c += ' '                     ;
                        for(j = 0 ; j < x ; j ++) if(c == b) break         ;
                        if(j < x) {
                              r = r * x + j                                 ;
                        } else {
                              r = f = 0                                       ;
                              break                                           ;
                        }
                }
                if(f) {
                        for(e = 1.0 / x , i ++ ; i < m ; e /= x , i ++) {
                              c = s                                        ;
                              if(c >= 'A' && c <= 'F') c += ' '               ;
                              for(j = 0 ; j < x ; j ++) if(c == b) break   ;
                              if(j < x) {
                                        r = r + j * e                           ;
                              } else {
                                        r = f = 0                               ;
                              }
                        }
                }
      }
      return r                                                                ;
}

// 将浮点数 z 转换为 x (2 - 16)进制字符串输出到字符串 t 中
char * tox(char t[] , float z , int x)
{
      const char b[] = {"0123456789abcdef"}                                 ;
      int d , i , m                                                         ;
      float f , r                                                             ;
      t = '\0'                                                             ;
      if(x <= 16) {
                d = z                                                         ;
                f = z - d                                                       ;
                for(i = 0 ; d ; d /= x , i ++) t = b                  ;
                t = '\0'                                                   ;
                reverse(t)                                                      ;
                if(f >= 0.000001) {
                        if(! i) t = '0'                                 ;
                        t = '.'                                           ;
                        for(; f >= 0.000001 ; i ++) {
                              r = f * x                                       ;
                              d = r                                           ;
                              t = b                                     ;
                              f = r - d                                       ;
                        }
                        t = '\0'                                             ;
                }
      }      
      return t                                                                ;
}

int main(void)
{
      char s , t , bin , oct , hex ;
      int d                                                 ;
      float f                                             ;
      printf("键入十进制数:")                              ;
      scanf("%d" , & d)                                     ;
      printf("bin : %s\n" , tox(bin , d , 2))               ;
      printf("oct : %s\n" , tox(oct , d , 8))               ;
      printf("hex : %s\n" , tox(hex , d , 16))            ;
      printf("键入十进制数:")                              ;
      scanf("%f" , & f)                                     ;
      printf("bin : %s\n" , tox(bin , f , 2))               ;
      printf("oct : %s\n" , tox(oct , f , 8))               ;
      printf("hex : %s\n" , tox(hex , f , 16))            ;
      printf("键入二进制数:")                              ;
      scanf("%s" , bin)                                     ;
      printf("dec : %.0f\n" , fromx(bin , 2))               ;
      printf("键入二进制数:")                              ;
      scanf("%s" , bin)                                     ;
      printf("dec : %f\n" , fromx(bin , 2))               ;
      printf("键入二进制数:")                              ;
      scanf("%s" , s)                                       ;
      printf("bin : %s\n" , tox(t , fromx(s , 2) , 2))      ;
      printf("qua : %s\n" , tox(t , fromx(s , 2) , 4))      ;
      printf("oct : %s\n" , tox(t , fromx(s , 2) , 8))      ;
      printf("dec : %s\n" , tox(t , fromx(s , 2) , 10))   ;
      printf("hex : %s\n" , tox(t , fromx(s , 2) , 16))   ;
      printf("键入十六进制数:")                            ;
      scanf("%s" , s)                                       ;
      printf("bin : %s\n" , tox(t , fromx(s , 16) , 2))   ;
      printf("qua : %s\n" , tox(t , fromx(s , 16) , 4))   ;
      printf("oct : %s\n" , tox(t , fromx(s , 16) , 8))   ;
      printf("dec : %s\n" , tox(t , fromx(s , 16) , 10))    ;
      printf("hex : %s\n" , tox(t , fromx(s , 16) , 16))    ;
}
      编译、运行实况:
D:\0002.Exercise\C>g++ -o fx2 fx2.c

D:\0002.Exercise\C>fx2
键入十进制数:235
bin : 11101011
oct : 353
hex : eb
键入十进制数:0.2357910
bin : 0.0011110001011100110011001
oct : 0.170563144
hex : 0.3c5ccc8
键入二进制数:10101101
dec : 173
键入二进制数:0.1110011
dec : 0.898438
键入二进制数:11101101
bin : 11101101
qua : 3231
oct : 355
dec : 237
hex : ed
键入十六进制数:12Def
bin : 10010110111101111
qua : 102313233
oct : 226757
dec : 77295
hex : 12def

D:\0002.Exercise\C>

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

      最后一个样例就是十六进制 12Def 的那一个,四进制数 1023233233 是错误的。正确的值应该是 102313233

一世轻尘 发表于 2020-12-23 23:30:53

已解决
页: [1]
查看完整版本: 进制转换十进制转二进制(包括小数)