二进制数转字符串
难度:
标签:
题目描述
Given a real number between 0 and 1 (e.g., 0.72) that is passed in as a double, print the binary representation. If the number cannot be represented accurately in binary with at most 32 characters, print "ERROR".
Example1:
Input: 0.625 Output: "0.101"
Example2:
Input: 0.1 Output: "ERROR" Note: 0.1 cannot be represented accurately in binary.
Note:
- This two charaters "0." should be counted into 32 characters.
- The number of decimal places for
num
is at most 6 digits
代码结果
运行时间: 24 ms, 内存: 16.0 MB
/*
* 思路:
* 使用Java Stream API进行二进制表示转换。
* 与传统方法类似,反复乘以2并检查整数部分。
* 使用StringBuilder累加二进制字符,超过32位则返回"ERROR"。
*/
import java.util.stream.Stream;
public class BinaryRepresentationStream {
public String printBinary(double num) {
if (num <= 0 || num >= 1) return "ERROR";
StringBuilder binary = new StringBuilder("0.");
Stream.iterate(num, n -> n * 2)
.limit(32)
.peek(n -> {
if (binary.length() < 32) {
if (n >= 1) {
binary.append(1);
n -= 1;
} else {
binary.append(0);
}
}
})
.allMatch(n -> binary.length() < 32 && n > 0);
return binary.length() < 32 ? binary.toString() : "ERROR";
}
public static void main(String[] args) {
BinaryRepresentationStream brs = new BinaryRepresentationStream();
System.out.println(brs.printBinary(0.625)); // 输出: 0.101
System.out.println(brs.printBinary(0.1)); // 输出: ERROR
}
}
解释
方法:
这个题解的思路首先是将输入的浮点数分为整数部分和小数部分。整数部分直接使用Python内置的bin函数转换成二进制,然后将小数部分乘以10的6次方并取整,得到一个较大的整数。这个整数被用于通过一系列的减法操作来确定它的二进制位。题解中设置了一个固定的模数列表,这些模数分别对应二进制小数位的1/2, 1/4, 1/8等的值。算法迭代地检查每个模数能否被当前的数整除,并相应地更新数值。如果在处理完所有模数后,数值不为零,算法返回'ERROR'表示无法精确表示。最后,算法检查尾部的零并去除,生成最终的二进制表示。
时间复杂度:
O(1)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么选择将小数部分乘以10的6次方而不是其他数值?这样的选择对结果的精度有何影响?
▷🦆
在使用固定模数列表处理二进制小数部分时,你是如何确定这些特定的模数值(如500000, 250000等)的?这些值是否与特定的二进制位精度直接相关?
▷🦆
题解中提到如果处理完所有模数后数值不为零就返回'ERROR',这种情况下是如何判断一个数字无法被精确地用32位二进制表示的?具体的逻辑是什么?
▷