「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战」
描述
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。
- 示例 1:
输入:0.625
输出:"0.101"
- 示例 2:
输入:0.1
输出:"ERROR"
提示:0.1无法被二进制准确表示
- 提示:
- 32位包括输出中的"0."这两位。
解析
做这道题之前需要自己去理解一下小数的二进制表示。其实跟十进制是很类似的。十进制下小数点右侧分别是十分位百分位千分位...,单位依次是(后面吗用括号表示幂)1/10(1),1/10(2),1/10(3)... 类似的,二进制小数小数点右侧依次为二分位,四分位,八分位...,单位依次是(后面吗用括号表示幂)1/2(1),1/2(2),1/2(3)。
下面是本题的解法:
因为该数num在0-1.0之间,因此可以采用折半比较法,与s(初始值0.5(二进制是0.1))进行比较: 1.如果num比较小,则直接在小数点后面添加0,然后再让它与0.25(s/2,二进制是0.01)进行比较; 2.如果num比较大,则小数点后的第一位则是1,更新num为num-s,此时num必定介于0-0.5之间,然后更新s为0.25。
- 重复以上操作。
class Solution {
public String printBin(double num) {
if(num>1||num<0) return "ERROR";
StringBuffer sb=new StringBuffer();
double s=0.50;
sb.append("0.");//该数是0-1之间的小数,因此先添加0.
while(num>0){
if(sb.length()>32) return "ERROR";//超出32位的计算精度
if(num<s) sb.append("0");
else{
num=num-s;
sb.append("1");
}
s/=2;
}
return sb.toString();
}
}
运行结果:
执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
内存消耗:35.8 MB, 在所有 Java 提交中击败了37.93%的用户