转化过程非常简单,就是整数部分对进制辗转取于,小数部分乘以进制,大于整数进位否则取0;
如12.56,小数部分转化为二进制:
0.56*2 = 1.12 取 1
0.12*2 = 0.24 取 0
0.24*2 = .48 取 0
0.48*2 = 0.96 取 0
0.96*2 = 1.92 取 1
……依次类推、、、
#include <stdio.h>
#include <string.h>
void two(int x, float y)
{
int a[1000], b[1000];
int t = 5;
int i = 0, j = 0;
while(x)
{
a[i++] = x%2;
x /= 2;
}
while(t--)
{
float p = 2.0*y;
if(p >= 1)
{
b[j++] = 1;
y = p-1;
}
else
{
b[j++] = 0;
y = p;
}
}
for(int k = i-1; k >= 0; k--)
printf("%d",a[k]);
printf(".");
for(int k = 0; k < j; k++)
printf("%d",b[k]);
printf("\n");
}
void eight(int x, float y)
{
int a[120], b[120], i = 0, j = 0;
int t = 5;
while(x)
{
a[i++] = x%8;
x /= 8;
}
while(t--)
{
float p = 8*y;
float q = p;
int xx = (int)p;
if(xx >= 1)
{
b[j++] = xx;
y = q-xx;
}
else
{
b[j++] = 0;
y = q;
}
}
for(int k = i-1; k >= 0; k--)
printf("%d",a[k]);
printf(".");
for(int k = 0; k < j; k++)
printf("%d",b[k]);
printf("\n");
}
void sixteen(int x, float y)
{
int i = 0, j = 0, t = 5;
char a[120], b[120];
while(x)
{
int p = x%16;
if(p == 10)
a[i++] = 'A';
else if(p == 11)
a[i++] = 'B';
else if(p == 12)
a[i++] = 'C';
else if(p == 13)
a[i++] = 'D';
else if(p == 14)
a[i++] = 'E';
else if(p == 15)
a[i++] = 'F';
else
a[i++] = p+'0';
x /= 16;
}
while(t--)
{
float yy = 16*y;
float pp = yy;
int xx = (int)yy;
if(xx >= 10)
{
b[j++] = 'A'+xx-10;
y = pp-xx;
}
else if(xx >= 1)
{
b[j++] = xx+'0';
y = pp-xx;
}
else
{
y = pp;
}
}
for(int k = i-1; k >= 0; k--)
printf("%c",a[k]);
printf(".");
for(int k = 0; k < j; k++)
printf("%c",b[k]);
printf("\n");
}
int main()//进制转换,每次只取小数点后五位
{
float x, y, z;
int t;
while(~scanf("%f",&z))
{
x = z;
t = (int)z;
y = x-t;
two(t, y);//二进制转化
eight(t, y);//八进制转化
sixteen(t, y);//十六进制转换
}
return 0;
}