北京市地铁建设公司网站,wap建站程序哪个好,企业网站可以个人备案,wordpress文章怎么打开空格来源#xff1a;力扣#xff08;LeetCode#xff09;
描述#xff1a;
二进制数转字符串。给定一个介于0和1之间的实数#xff08;如0.72#xff09;#xff0c;类型为double#xff0c;打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示#xff0…来源力扣LeetCode
描述
二进制数转字符串。给定一个介于0和1之间的实数如0.72类型为double打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示则打印“ERROR”。
示例1: 输入0.625输出0.101示例2: 输入0.1输出ERROR提示0.1无法被二进制准确表示提示
32位包括输出中的 “0.” 这两位。题目保证输入用例的小数位数最多只有 6 位
方法转换二进制数
介于 0 和 1 之间的实数的整数部分是 0小数部分大于 0因此其二进制表示的整数部分是 0需要将小数部分转换成二进制表示。
以示例 1 为例十进制数 0.625 可以写成 1 1211 \over 2^1211 1231 \over 2^3231因此对应的二进制数是 0.101(2) 二进制数中的左边的 1 为小数点后第一位表示 1211 \over 2^1211右边的 1 为小数点后第三位表示 1231 \over 2^3231。
如果将十进制数 0.625 乘以 2则得到 1.25可以写成 1211 \over 2^1211 1231 \over 2^3231因此对应的二进制数是 1.01(2) 。二进制数 0.101(2) 的两倍是 1.01(2) 因此在二进制表示中将一个数乘以 2 的效果是将小数点向右移动一位。
根据上述结论将实数的十进制表示转换成二进制表示的方法是每次将实数乘以 2将此时的整数部分添加到二进制表示的末尾然后将整数部分置为 0重复上述操作直到小数部分变成 0 或者小数部分出现循环时结束操作。当小数部分变成 0 时得到二进制表示下的有限小数当小数部分出现循环时得到二进制表示下的无限循环小数。
由于这道题要求二进制表示的长度最多为 32 位否则返回 “ERROR因此不需要判断给定实数的二进制表示的结果是有限小数还是无限循环小数而是在小数部分变成 0 或者二进制表示的长度超过 32 位时结束操作。当操作结束时如果二进制表示的长度不超过 32 位则返回二进制表示否则返回 “ERROR。
代码
class Solution {
public:string printBin(double num) {string res 0.;while (res.size() 32 num ! 0) {num * 2;int digit num;res.push_back(digit 0);num - digit;}return res.size() 32 ? res : ERROR;}
};执行用时0 ms, 在所有 C 提交中击败了100.00%的用户 内存消耗5.8 MB, 在所有 C 提交中击败了75.12%的用户 复杂度分析 时间复杂度O©其中 C 是结果字符串的最大长度C32。最多计算 32 位每一位的计算时间是 O(1)。 空间复杂度O©其中 C 是结果字符串的最大长度C 32。存储结果的字符串需要 O© 的时间。 authorLeetCode-Solution