海爾公司網(wǎng)站建設(shè)現(xiàn)狀廚師培訓(xùn)機構(gòu)
來源:力扣(LeetCode)
描述:
二進制數(shù)轉(zhuǎn)字符串。給定一個介于0和1之間的實數(shù)(如0.72),類型為double,打印它的二進制表達式。如果該數(shù)字無法精確地用32位以內(nèi)的二進制表示,則打印“ERROR”。
示例1:
輸入:0.625輸出:"0.101"
示例2:
輸入:0.1輸出:"ERROR"提示:0.1無法被二進制準確表示
提示:
- 32位包括輸出中的 “0.” 這兩位。
- 題目保證輸入用例的小數(shù)位數(shù)最多只有 6 位
方法:轉(zhuǎn)換二進制數(shù)
介于 0 和 1 之間的實數(shù)的整數(shù)部分是 0,小數(shù)部分大于 0,因此其二進制表示的整數(shù)部分是 0,需要將小數(shù)部分轉(zhuǎn)換成二進制表示。
以示例 1 為例,十進制數(shù) 0.625 可以寫成 1 + 1211 \over 2^1211? + 1231 \over 2^3231?,因此對應(yīng)的二進制數(shù)是 0.101(2) ,二進制數(shù)中的左邊的 1 為小數(shù)點后第一位,表示
1211 \over 2^1211?,右邊的 1 為小數(shù)點后第三位,表示 1231 \over 2^3231?。
如果將十進制數(shù) 0.625 乘以 2,則得到 1.25,可以寫成 1211 \over 2^1211? + 1231 \over 2^3231?,因此對應(yīng)的二進制數(shù)是 1.01(2) 。二進制數(shù) 0.101(2) 的兩倍是 1.01(2) ,因此在二進制表示中,將一個數(shù)乘以 2 的效果是將小數(shù)點向右移動一位。
根據(jù)上述結(jié)論,將實數(shù)的十進制表示轉(zhuǎn)換成二進制表示的方法是:每次將實數(shù)乘以 2,將此時的整數(shù)部分添加到二進制表示的末尾,然后將整數(shù)部分置為 0,重復(fù)上述操作,直到小數(shù)部分變成 0 或者小數(shù)部分出現(xiàn)循環(huán)時結(jié)束操作。當小數(shù)部分變成 0 時,得到二進制表示下的有限小數(shù);當小數(shù)部分出現(xiàn)循環(huán)時,得到二進制表示下的無限循環(huán)小數(shù)。
由于這道題要求二進制表示的長度最多為 32 位,否則返回 “ERROR",因此不需要判斷給定實數(shù)的二進制表示的結(jié)果是有限小數(shù)還是無限循環(huán)小數(shù),而是在小數(shù)部分變成 0 或者二進制表示的長度超過 32 位時結(jié)束操作。當操作結(jié)束時,如果二進制表示的長度不超過 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";}
};
執(zhí)行用時:0 ms, 在所有 C++ 提交中擊敗了100.00%的用戶
內(nèi)存消耗:5.8 MB, 在所有 C++ 提交中擊敗了75.12%的用戶
復(fù)雜度分析
時間復(fù)雜度:O?,其中 C 是結(jié)果字符串的最大長度,C=32。最多計算
32 位,每一位的計算時間是 O(1)。
空間復(fù)雜度:O?,其中 C 是結(jié)果字符串的最大長度,C = 32。存儲結(jié)果的字符串需要 O? 的時間。
author:LeetCode-Solution