进制转换十进制转二进制(包括小数)
本帖最后由 一世轻尘 于 2020-12-23 13:47 编辑如下 本帖最后由 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 已解决
页:
[1]