| 
 | 
 
 
发表于 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] ; m ++)                                                ;
 
 -         for(i = 0 ; i < m / 2 ; i ++) {
 
 -                 c = s[m - 1 - i]                                                ;
 
 -                 s[m - 1 - i] = s[i]                                             ;
 
 -                 s[i] = 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] ; m ++)                                        ;
 
 -                 for(f = 1 , r = i = 0 ; i < m && s[i] != '.' && f ; i ++) {
 
 -                         c = s[i]                                                ;
 
 -                         if(c >= 'A' && c <= 'F') c += ' '                       ;
 
 -                         for(j = 0 ; j < x ; j ++) if(c == b[j]) 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[i]                                        ;
 
 -                                 if(c >= 'A' && c <= 'F') c += ' '               ;
 
 -                                 for(j = 0 ; j < x ; j ++) if(c == b[j]) 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] = '\0'                                                             ;
 
 -         if(x <= 16) { 
 
 -                 d = z                                                           ;
 
 -                 f = z - d                                                       ;
 
 -                 for(i = 0 ; d ; d /= x , i ++) t[i] = b[d % x]                  ;
 
 -                 t[i] = '\0'                                                     ;
 
 -                 reverse(t)                                                      ;
 
 -                 if(f >= 0.000001) {
 
 -                         if(! i) t[i ++] = '0'                                   ;
 
 -                         t[i ++] = '.'                                           ;
 
 -                         for(; f >= 0.000001 ; i ++) {
 
 -                                 r = f * x                                       ;
 
 -                                 d = r                                           ;
 
 -                                 t[i] = b[d]                                     ;
 
 -                                 f = r - d                                       ;
 
 -                         }
 
 -                         t[i] = '\0'                                             ;
 
 -                 }
 
 -         }        
 
 -         return t                                                                ;
 
 - }
 
  
- int main(void)
 
 - {
 
 -         char s[256] , t[256] , bin[256] , oct[256] , hex[256] ;
 
 -         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 |   
 
 
 
 |