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