面试题05.02 二进制数转字符串(c++)

100 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

面试题05.02 二进制数转字符串

二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。

示例 1 :

输入:0.625
输出:"0.101"

示例 2:

 输入:0.1
输出:"ERROR"
提示:0.1无法被二进制准确表示

提示:

  • 32位包括输出中的 "0." 这两位。
  • 题目保证输入用例的小数位数最多只有 6 位

二、思路分析

在本题中,我也是看了一些解法,因为题目的提示中给出了题目保证输入用例的小数位数最多只有 6 位,所以通过证明可以得出一个结论,当 num 的十进制的小数位数最多只有 6 位时,若 num 能表示为有限位二进制小数,则二进制的小数位数同样至多为 6 位。

如何用代码实现呢?可以先定义好一个字符串。将题目所给的数每次乘以2,如果这个数大于1了,那么定义好的字符串就加1,如果没有,就加0。接着将num自减一。如此循环六次后,如果num=0,直接输出字符串即可。如果没等于0的话,则输出ERROR。

三、AC代码

class Solution {
public:
    string printBin(double num) {
        string ans="0.";
        for(int i=0;i<6;i++){
            num=num*2;
            if(num<1){
                ans+="0";
            }
            else{
                ans+="1";
                if(--num==0){
                    return ans;
                }
            }
        }     
        return "ERROR";
    }
};

四、总结

一开始没弄懂小数的补码应该怎么算?后来查阅了相关的资料才知道小数的补码应该怎么去计算。