問題描述:
給定一個數將其轉換為二進制(均用字符串表示),如果這個數的小數部分不能在 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";
}
};