You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二进制字符串转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;
}

额外优化建议

  1. 精简头文件:仅保留必要的iostream和string即可,去掉多余的string.h、vector等。
  2. 变量类型优化:count用long long更稳妥,避免极端场景下溢出。
  3. 代码可读性:用范围for循环遍历字符串,比下标循环更简洁。

运行修改后的代码,输入给定的二进制串会得到正确输出85。

内容的提问来源于stack exchange,提问作者Nitish Magendran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 23:33:14