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

求数字转全偶位幸运数的最小步数及C++代码错误排查

问题描述

给定一个数字,每次操作可选择将数字加1或减1,单次操作记为1步,求将给定数字转换为幸运数所需的最少步数。其中幸运数定义为所有数位均为偶数的数字。

待验证代码
#include<bits/stdc++.h>
using namespace std;

int count(int n)
{
    int count = 0;
    while (n != 0)
    {
        n = n / 10;
        ++count;
    }
    return count;
}

int firstDigit(int n)
{
    // Remove last digit from number
    // till only one digit is left
    while (n >= 10)
        n /= 10;
     
    // return the first digit
    return n;
}

int main()
{
    int n;
    cin >> n;

    int i,j,ans=0;

    int x = count(n);

    while(x--)
    {
        if(firstDigit(n)%2 != 0)
        {
            if(firstDigit(n) == 9)
            {
                ans = ans + pow(10,x);
                n = n-pow(10,x);
            }

            else
            {
                ans = ans + pow(10,x);
                n = n + pow(10,x);
            }
        }
        
        else
        n = n - pow(10,x);

    }

    cout << ans << endl;

}
已发现问题

输入数字100时代码输出错误,需要定位逻辑错误。


错误定位

1. 浮点数精度问题

C++标准库的pow函数返回值为double类型,直接和整数运算会出现精度丢失,比如部分场景下pow(10,2)计算结果为99.9999999999,强转成int就变成了99,这是输入100出错的直接诱因之一。

2. 核心逻辑完全错误

你当前的处理逻辑存在本质问题:

  • 遇到奇数位时,没有比较往下降到更小的偶数和往上升到更大的偶数两种方案的步数,直接固定选择加(9的情况减),很多场景下会选到步数更大的方案。比如百位是1的情况,降到0只需要1100步,升到2需要1100步看起来步数相同,但后面低位的计算完全错了。
  • 处理完当前位之后直接执行n = n - pow(10,x),相当于直接抹掉当前位的数值,完全没有考虑低位所有数位也需要是偶数的要求,导致后续计算完全偏离实际需求。

以输入100为例,正确的最小步数是12(降到88,所有数位都是偶数),但你的代码执行流程如下:

  • count(100)=3,初始x=2,n=100
  • x=2:第一位是1(奇数),ans加100,n变成200
  • x=1:第一位是2(偶数),n=200-10=190
  • x=0:第一位是1(奇数),ans加1,n变成191
  • 最终输出ans=101,和正确结果12完全不符。

3. 没有考虑进位/借位的连锁影响

调整低位的时候可能会导致高位的数值发生变化,比如899调整个位加1变成900,原本的高位8变成9(奇数),你当前从高位往低位处理的逻辑完全没有考虑这种情况。

修复建议
  1. 替换所有pow调用,自己实现整数幂函数,避免浮点数精度问题:
int pow10(int x) {
    int res = 1;
    while(x--) res *= 10;
    return res;
}
  1. 调整核心逻辑:从高位往低位遍历,找到第一个奇数位,分别计算两个边界幸运数的步数取最小值即可:
  • 上界:当前奇数位加1(如果是9则进位),后面所有位补0,计算差值
  • 下界:当前奇数位减1,后面所有位补8,计算差值
  • 两个差值取较小值就是最终答案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:42:03