港口建设征收 申报网站危机公关处理
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。
示例1:
输入:0.625
输出:"0.101"
示例2:
输入:0.1
输出:"ERROR"
提示:0.1无法被二进制准确表示
提示:
32位包括输出中的 "0." 这两位。
题目保证输入用例的小数位数最多只有 6 位
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/bianry-number-to-string-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
笑死,看见题目下面说最多只有6位我就有了一个恶毒的方法:直接建立map字典,从1位小数算到6位小数(即从包含"0."的3位到8位),这时候就是很明显的一道dfs题目了!复习一下dfs。结果超过了100%哈哈。
class Solution {
public:map<double,string>m;void dfs(double n,double su,string s){if(s.length()>8){return;}m[su+n*0.5]=s+"1";dfs(n*0.5,su+n*0.5,s+"1");dfs(n*0.5,su,s+"0");}string printBin(double num) {dfs(1,0,"0.");if(m[num]==""){return "ERROR";}return m[num];}
};
然后看了看官方题解,学了一下小数应该怎么转进制——>移位。比如二进制,要向左移,*2即可。
这边判断放到7就可以。本来就应该只有6位,因为这个小数只有6位,放到7位方便判断error,如果到7才跳出,说明不符合要求。
忒简单了。
class Solution {
public:string printBin(double num) {int i=0;int n;string s="0.";while(i<7 and num!=0){num*=2;int tempnum=num;s+=char(tempnum+48);num=num-tempnum;i++;}if(i==7){return "ERROR";}return s;}
};