1. 题目与解析
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。
输入:0.625
输出:"0.101"
输入:0.1
输出:"ERROR"
提示:0.1无法被二进制准确表示
提示:
- 32位包括输出中的
"0."
这两位。 - 题目保证输入用例的小数位数最多只有
6
位 介于 000 和 111 之间的实数的整数部分是 000,小数部分大于 000,因此其二进制表示的整数部分是 000,需要将小数部分转换成二进制表示。
我们使用二进制表示小数时,第i
位数字表示(1/2)^i
是1
还是0
,举一个例子,0.101
就表示1*(1/2)^1 + 0*(1/2)^2 + 1*(1/2)^3
。知道了这一点,如果我们给某个小数乘以2
,如果其整数部分增加了1
,就说明(1/2)^i
位置上是1
,反之则是0
。
十进制小数转二进制小数的方法是:小数部分乘以 2
,取整数部分作为二进制小数的下一位,小数部分作为下一次乘法的被乘数,直到小数部分为 0
或者二进制小数的长度超过 32
位。
对于本题,由于实数介于 0
和 1
之间,所以其整数部分一定是 0
,我们只需要将小数部分,按照上述方法转换为二进制小数即可。当小数部分为 0
或者二进制小数的长度不小于 32
位时,停止转换。
最后,如果小数部分不为 0
,说明该实数无法用 32
位以内的二进制表示,返回字符串 "ERROR"
,否则返回转换后的二进制小数。
2. 题解
class Solution {
public String printBin(double num) {
StringBuilder ans = new StringBuilder("0.");
while (ans.length() < 32 && num != 0) {
num *= 2;
int x = (int) num;
ans.append(x);
num -= x;
}
return num != 0 ? "ERROR" : ans.toString();
}
}