C++中超长二进制字符串转十进制字符串的更优实现咨询
超长二进制字符串转十进制字符串的高效实现
你的原代码存在几个问题:
- 使用
std::pow(2, i)会引入浮点数精度误差,当i较大时根本得不到正确的2的幂值 - 字符串加法函数未处理进位逻辑,且循环索引越界(
i = (int32_t)s1.size()会访问超出字符串长度的位置) - 逐个计算
2^i再累加的方式效率极低,二进制字符串越长,性能下降越明显
更简单高效的实现思路是模拟手动进制转换的过程:从左到右遍历二进制字符串,每一步将当前的十进制结果乘以2,再加上当前二进制位的数值(0或1),全程用字符串维护十进制数,避免整数溢出。
具体实现代码
#include <string> #include <algorithm> std::string binary_to_decimal(const std::string& binary_str) { std::string decimal = "0"; for (char c : binary_str) { // 第一步:将当前十进制数乘以2 int carry = 0; for (auto it = decimal.rbegin(); it != decimal.rend(); ++it) { int digit = (*it - '0') * 2 + carry; *it = (digit % 10) + '0'; carry = digit / 10; } if (carry > 0) { decimal.insert(decimal.begin(), carry + '0'); } // 第二步:加上当前二进制位的数值 if (c == '1') { carry = 1; for (auto it = decimal.rbegin(); it != decimal.rend() && carry; ++it) { int digit = (*it - '0') + carry; *it = (digit % 10) + '0'; carry = digit / 10; } if (carry > 0) { decimal.insert(decimal.begin(), carry + '0'); } } } // 处理二进制字符串全0的情况 size_t first_non_zero = decimal.find_first_not_of('0'); if (first_non_zero != std::string::npos) { return decimal.substr(first_non_zero); } return "0"; }
代码说明
- 乘2操作:从十进制字符串的末尾(个位)开始遍历,每个数字乘以2并加上进位,更新当前位和进位,最后如果还有进位就插入到字符串头部。
- 加当前二进制位:如果当前二进制位是'1',就给十进制字符串加1,同样从末尾开始处理进位。
- 边界处理:如果输入的二进制字符串全是0,最终返回"0",避免返回一串0的情况。
这种方法的时间复杂度是O(n*m),其中n是二进制字符串的长度,m是最终十进制字符串的长度,相比你原代码的指数级复杂度,效率提升非常明显,逻辑也更清晰易懂。
内容的提问来源于stack exchange,提问作者Somedude
相关产品推荐
相关产品推荐

