美文网首页
Lintcode-二进制表示

Lintcode-二进制表示

作者: 爱秋刀鱼的猫 | 来源:发表于2017-03-04 10:47 被阅读0次

    问题描述:

    给定一个数将其转换为二进制(均用字符串表示),如果这个数的小数部分不能在 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";
        }
    };
    

    相关文章

      网友评论

          本文标题:Lintcode-二进制表示

          本文链接:https://www.haomeiwen.com/subject/wmmdgttx.html