《程序员面试金典》(第六版)习题:仅为记录一下以加强印象,不为商业用途,如有侵权请联系删除。以下源码和解释参考了书中源码以及解释。
这里提供两种方法。第一种方法利用的是十进制小数转二进制小数的乘2取整法。对于值为1的二进制小数位,第一位的值为
2
−
1
=
0.5
2^{-1}=0.5
2−1=0.5,第二位的值为
2
−
2
=
0.25
2^{-2}=0.25
2−2=0.25,第三位的值为
2
−
1
=
0.125
2^{-1}=0.125
2−1=0.125,第四位的值为
2
−
1
=
0.0625
2^{-1}=0.0625
2−1=0.0625,…以此类推。第二种方法从第一位开始检查二进制小数中是否满足该二进制位为1,如果满足则在结果字符串中加一并且从原十进制小数中减去该二进制位的十进制值,否则加0原二进制数的值不变。然后进去下一轮迭代直到为0。实现代码如下所示。
//方法一
string printBinary(double num)
{
if (num > 1 || num <= 0)
return "ERROR";
string binary;
binary = binary + "0.";
while (num>0)
{
if (binary.size() >= 32)
return "ERROR";
double r = num * 2;
if (r >= 1)
{
binary = binary + "1";
num = r - 1;
}
else
{
binary = binary + "0";
num = r;
}
}
return binary;
}
//方法二
string printBinary2(double num)
{
if (num > 1 || num <= 0)
return "ERROR";
string binary;
double frac = 0.5;
binary = binary + "0.";
while (num > 0)
{
if (binary.size() >= 32)
return "ERROR";
if (num >= frac)
{
binary = binary + "1";
num = num - frac;
}
else
{
binary = binary + "0";
}
frac = frac / 2;
}
return binary;
}