#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)) ;
}