|
发表于 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 |
|