给定一个以字符串形式表示的小数(例如:3.72),输出该数的二进制表示。如果该数不能精确地表示为二进制形式,输出“ERROR”。
例子:
输入:3.25
输出:11.01
思路:将小数分成两部分:整数部分和小数部分。整数部分很简单。小数部分想要转化为二进制,可以将小数乘以2的结果和1进行比较,如果大于等于1,该位为1并将结果减1;否则为0。如果小数部分的二进制位数超过某个长度,可以认为无法精确地表示为二进制形式。
小数部分的例子:
0.25:0.25 * 2 = 0.5,小于1,该位为0;0.5 * 2 = 1.0,等于1,该位为1,减1之后为0。结果:0.01。
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
string PrintBinary(const string& num)
{
if (num.size() == 0)
return "";
int index = num.find('.');
int intPart;
double decPart;
string intStr, decStr;
if (index == -1)
{
intPart = atoi(num.c_str());
decPart = 0;
}
else
{
intPart = atoi(num.substr(0, index).c_str());
decPart = atof(num.substr(index, num.size() - index).c_str());
}
if (intPart == 0)
intStr += "0";
while (intPart > 0)
{
int temp = intPart & 1;
intStr = (temp == 1) ? ("1" + intStr) : ("0" + intStr);
intPart >>= 1;
}
if (decPart == 0)
decStr += "0";
while (decPart > 0)
{
if (decStr.size() > 32)
return "ERROR";
decPart *= 2;
if (decPart >= 1)
{
decStr += "1";
decPart -= 1;
}
else
decStr += "0";
}
if (index == -1)
return intStr;
else
return intStr + "." + decStr;
}
int main()
{
string num;
while (getline(cin, num))
cout << PrintBinary(num) << endl;
return 0;
}