二进制字符串转1的步数计算:代码输出与预期不符求助
问题分析与解决
核心问题
你的代码在二进制转十进制时使用了pow(2, ...)这个浮点型函数,浮点数的精度有限,当二进制串长度超过60位时,pow返回的结果会出现精度丢失,导致转换后的dec值和真实值不符,最终步数计算错误。
比如你输入的二进制串对应的真实十进制数是278675673186014705,但用pow转换后得到的dec值偏小,后续循环的步数自然少了。
修复方案
替换pow,用整数移位的方式完成二进制转十进制,彻底避免浮点精度问题。具体逻辑是:初始化dec为0,遍历二进制字符串每一位时,先将dec左移1位(等价于乘以2),再加上当前位的数值(0或1)。
修改后的代码如下:
#include <iostream> #include <string> using namespace std; int main() { string s = "1111011110000011100000110001011011110010111001010111110001"; long long count = 0; unsigned long long dec = 0; // 二进制转十进制:用整数移位替代pow for (char c : s) { dec = dec << 1; if (c == '1') { dec += 1; } } while (dec != 1) { if (dec % 2 == 0) { dec /= 2; } else { dec += 1; } count++; } cout << count << endl; return 0; }
额外优化建议
- 精简头文件:仅保留必要的
iostream和string即可,去掉多余的string.h、vector等。 - 变量类型优化:
count用long long更稳妥,避免极端场景下溢出。 - 代码可读性:用范围for循环遍历字符串,比下标循环更简洁。
运行修改后的代码,输入给定的二进制串会得到正确输出85。
内容的提问来源于stack exchange,提问作者Nitish Magendran
相关产品推荐
相关产品推荐

