给定一个以字符串形式表示的小数(例如: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; }