面试题 05.02. 二进制数转字符串
笑死,我都能不看题解一次过的题为什么是medium啊。
首先,十进制小数转二进制,方法是每次将十进制小数乘2,如果大于1,那该位二进制为1,并减1,否则该位为0。循环往复直到该十进制小数刚好变成0或达到一定的位数,精度足够,便停止。
如
0.625
0.625
0.625 ,按照上述操作,分别对应
1.25
−
1
=
0.25
、
0.5
、
1.0
−
1
=
0
1.25-1=0.25、0.5、1.0-1=0
1.25−1=0.25、0.5、1.0−1=0 ,所以对应的二进制为
0.101
0.101
0.101 。
class Solution {
public:
string printBin(double num) {
int k=30;
string res="0.";
while(num&&k){
num*=2.0;
if(num>=1){
res+="1";
num-=1.0;
}
else res+="0";
k--;
}
if(num) return "ERROR";
return res;
}
};
But,灵神证明了,6位十进制小数如果不是无限循环二进制,那必然能在6次只能转为二进制,具体证明看这里。因此,其实上述代码最多六次就行了,不用30次。
int k=6;