首页 > 代码库 > Cracking the Coding Interview 5.2

Cracking the Coding Interview 5.2

Given a(decimal -e.g. 3.72)number that is passed in as a string, print the binary representation. If the number can not be represented accurately in binary, print "ERROR"

 

整数部分:

    对2取余,然后向右移动一位,重复直到整数部分变为0

小数部分:

    乘以2,看结果是否大于1,大于1则2^-1位上位1,否则为0。如果大于1,将结果减1再乘以2,否则直接乘以2,继续判断,直到小数部分超过32位,返回ERROR

    例如:0.75d = 0.11b,乘以2实际上相当于左移,结果大于1,则说明2^-1位上是1,然后减1,继续乘以2,结果等于1,说明2^-2上是1,且后面没有小数了。

#include<iostream>#include<string>#include<stdlib.h>using namespace std;string func(const string &str){    string strInt;    string strDou;    string::size_type idx = str.find(.);        if(idx == string::npos)    {        strInt = str;    }    else    {        strInt = str.substr(0,idx);        strDou = str.substr(idx);    }    int intPart = atoi(strInt.c_str());    double douPart;    if(!strDou.empty())    {        douPart = atof(strDou.c_str());    }    else    {        douPart = 0.0;    }    string strIntB,strDouB;    while(intPart!=0)    {        if((intPart&1)>0)        {            strIntB = 1+strIntB;        }        else        {            strIntB = 0+strIntB;        }        intPart=intPart>>1;    }    while(!(douPart>-10e-15 && douPart<10e-15))    {        if(douPart*2>1)        {            strDouB = 1+strDouB;            douPart = douPart*2-1;        }        else if((douPart*2-1)>-10e-15 && (douPart*2-1)<10e-15)        {            strDouB = 1+strDouB;            break;        }        else        {            strDouB = 0+strDouB;        }        if(strDouB.size()>32)        {            return "ERROR";        }    }    if(strDouB.empty())    {        return strIntB;    }    else    {        return (strIntB+.+strDouB);    }}int main(){    string str("3.75");    cout<<func(str)<<endl;    return 0;}