二进制表示

来源:互联网 发布:流程优化 编辑:程序博客网 时间:2024/05/21 02:36
/*
问题描述:给定一个数将其转换为二进制(均用字符串表示),如果这个数的小数部分不能在 32 个字符之内来精确地表示,则返回 "ERROR"。
来源:LintCode
作者:syt

日期:2017-9-9

思路:

方法3,将整数部分和小数部分分开计算,由于int整数可能会越界,使用long long,分别计算后,合并计算结果,LintCode通过

方法2,在论坛上看到有人这么做,根据double类型的存储结构计算,感兴趣的可以仔细看一下这个方法http://blog.csdn.net/sweeterer/article/details/52213973,不过LintCode貌似不支持 Bitset,没通过

方法1,仅适合小一点的数,不合适

*/

#include <iostream>#include <string>#include <stdlib.h>#include <bitset>#include <vector>using namespace std;/**@param n: Given a decimal number that is passed in as a string*@return: A string*/string binaryRepresentation3(string n) {string result = "";vector<int> intSection;vector<int> decSection;bool isLoc = false;for (int i = 0; i < n.size(); i++){if (n[i] == '-')continue;if (n[i] == '.'){isLoc = true;continue;}if (!isLoc){intSection.push_back(n[i] - '0');}elsedecSection.push_back(n[i] - '0');}long long inte = 0;int inteLen = intSection.size();for (int i = 0; i < inteLen; i++){inte = inte + intSection[i] * pow(10, inteLen - i - 1);}long long deci = 0;int deciLen = decSection.size();for (int i = 0; i < deciLen; i++){deci = deci + decSection[i] * pow(10, deciLen - i - 1);}if (inte == 0){result = "0";}else{while (inte != 0){result = to_string(inte % 2) + result;inte = inte / 2;}}if (deci == 0)return result;else{result += ".";string deciString = "";while (deci > 0){//cout << "deci:" << deci << endl;if (deciString.size() > 32)return "ERROR";deci = deci * 2;if (deci >= pow(10, deciLen)){deciString = deciString + to_string(1);deci = deci - pow(10, deciLen);}elsedeciString = deciString + "0";}result += deciString;}return result;}string binaryRepresentation2(string n) {// wirte your code herestring result = "";string inte_string = "";string deci_string = "0";int flag = 0;for (int i = 0; i < n.size(); i++){if (n[i] != '.'){inte_string += n[i];}else{flag = i;break;}}deci_string += n.substr(flag, n.size() - flag);//cout << inte_string << endl;//cout << deci_string << endl;int inte = atof(inte_string.c_str());//cout << inte << endl;if (inte == 0)result += "0";else{while (inte != 0){result = to_string(inte % 2) + result;inte /= 2;}}//cout << result << endl;double deci = atof(deci_string.c_str());cout << deci << endl;if (deci == 0)return result;result += ".";bitset<64> deci_bit;memcpy(&deci_bit, &deci, 8);cout << endl;string str = deci_bit.to_string();//cout << str << endl;bitset<11> i_bit(str, 1, 11);int index = i_bit.to_ulong() - 1023;//cout << index << endl;for (int i = 44 + index; i < str.size(); i++){if (str[i] == '1')return "ERROR";}int j = 44 + index;while (str[j] == '0' && j > 12)j--;//cout << "j=" << j << endl;string tmp = str.substr(12, j - 12 + 1);string empty = "";while (index < -1){empty += "0";index++;}empty += "1";//cout << str.substr(12, j - 12 + 1) << endl;if (str.substr(12, j - 12 + 1) != "0")empty += str.substr(12, j - 12 + 1);result += empty;return result;}string binaryRepresentation1(string n) {// wirte your code herestring result = "";double fn = atof(n.c_str());int inte = int(fn);double deci = fn - inte;if (inte == 0)result += "0";else{while (inte != 0){result = to_string(inte % 2) + result;inte /= 2;}}if (deci == 0)return result;result = result + ".";for (int i = 0; i < 32; i++){cout << deci << endl;if (deci != 0){if (deci * 2 >= 1){result += "1";deci = deci * 2 - 1;}else{result += "0";deci = deci * 2;}}}if (deci != 0)return "ERROR";elsereturn result;}

原创粉丝点击