Lintcode-二進制表示

問題描述:

給定一個數將其轉換為二進制(均用字符串表示),如果這個數的小數部分不能在 32 個字符之內來精確地表示,則返回 "ERROR"。

難點:

1、如何將小數部分轉化為二進制;這就涉及到將string類型轉化為float類型。
剛開始我是用了

#include<sstream>
stringstream ss;
float x;
string str="0.1";
ss<<str;
ss>>x;

用這種方式有時候會出錯,這種方式有時候得不到正確的float值。所以為了得到正確的float類型,采用了atof(charp);這一個函數。
注意這個函數的參數是一個char的指針類型,而不是string。所以要將string轉化為char
。使用string的函數str.c_str();
具體的代碼為:

double x;
string str="1.00000000001";
const char*p=str.c_str();
x=atof(p);

2、這里還有一個問題就是很多細節的考慮;
比如說,在將整型十進制轉化為二進制時,需要考慮輸入的整數是為0的情況。
在小數轉化為二進制的時候,也要考慮小數點的有無。

代碼實現:

class Solution {
public:
    /**
     *@param n: Given a decimal number that is passed in as a string
     *@return: A string
     */
    string des2binary(int n)
    {
        if(n==0)
        return "0";
        string ans;
        while (n!=0)
        {
            char c=n%2+'0';
            ans.insert(ans.begin(),c);
            n/=2;
        }
        return ans;
    }
    string binaryRepresentation(string n) {
        // wirte your code here
        string inte;
        string res;//存放最后的結果
        string frac="0";
        int flag;
        for(int i=0;i<n.size();i++)
        {
            if(n[i]!='.')
            {
                inte+=n[i];
                
            }else
                {flag=i;
                break;
            }
        }
        for(int i=flag;i<n.size();i++)
        {
            frac+=n[i];
        }
        stringstream ss;
        int inte1;
        ss<<inte;
        ss>>inte1;
        res+=des2binary(inte1);
        int a=32-res.size();
        double x;
        const char* putin;
        putin=frac.c_str();
        x=atof(putin);
        if(x!=0)
            res+='.';
        for(int i=0;i<32;i++)
        {
            if (x!=0)
            {
                //char c=x*2-1 +'0';//這里的寫法是錯的
                if(x*2>=1){
                    res+='1';
                    x=x*2-1;
                }
                else
                {
                    res+='0';
                    x=x*2;
                }
            }
            else
            {
                return res;
            }
        }
        return "ERROR";
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容