题目:二进制转字符串
给定一个介于 0 和 1 之间的实数(如 0.72),类型为 double,打印它的二进制表达式。如果该数字无法精确地用 32 位以内的二进制表示,则打印“ERROR”。
一、思路
用
X
2
X_2
X2和
X
10
X_{10}
X10来表示X是二进制还是十进制。非整数用二进制表示是与十进制相仿,二进制数0.1012表示如下
0.10
1
2
=
1
∗
1
/
2
1
+
0
∗
1
/
2
2
+
1
∗
1
/
2
3
0.101_2 = 1*1/2^1 + 0*1/2^2 + 1*1/2^3
0.1012=1∗1/21+0∗1/22+1∗1/23
- 将这个数乘以2,检查2n是否大于或等于1.这实质上等同于“移动”小数部分,表示如下。
r = 2 10 ∗ 0.10 1 2 = 1 ∗ 1 / 2 0 + 0 ∗ 1 / 2 1 + 1 ∗ 1 / 2 2 = 1.0 1 2 r=2_{10}*0.101_2= 1*1/2^0 + 0*1/2^1 + 1*1/2^2=1.01_2 r=210∗0.1012=1∗1/20+0∗1/21+1∗1/22=1.012
若 r > = 1 r>=1 r>=1,可知n的个位正好有个1。不断重复上述步骤,我们可以检查每个数位。
二、解法
1.乘2法
string printBin(double num) {
if(num > 1 || num < 0) return "ERROR";
ostringstream s;
s << "0.";
while(num != 0){
if(s.str().length() >= 32){
return "ERROR";
}
double r = num * 2;
if(r >= 1){
s << 1;
num = r-1;
}else{
s << 0;
num = r;
}
}
return s.str();
}