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

C#实现int数组加1功能遇异常:输出结果不符求助

问题分析

你的代码存在两个关键问题导致输出异常:

  • 字符转数字时误取ASCII码:Convert.ToInt32(s[j])会把字符(比如'1')转换成对应的ASCII值(49),而非你需要的数字1。字符'0'到'9'的ASCII码是连续的,用字符减去'0'就能得到对应数字。
  • 用double存储大数字有精度隐患:当输入数组长度超过15位时,double的精度不足以准确表示整数,Math.Pow的计算结果会出现偏差,导致最终数字错误。

临时修复(解决当前输出问题)

如果只是先修正当前的输出错误,只需修改字符转数字的逻辑:

public static int[] PlusOne(int[] digits) 
{ 
    double changedDigits = 0 ; 

    for (int i=0 ; i <= digits.Length -1 ; i ++ ){
       changedDigits += digits[i] * Math.Pow(10, digits.Length-i-1); 
    }

    string s = (changedDigits+1).ToString();  
    int[] result = new int[s.Length] ;

    for (int j = 0; j < s.Length ; j ++) {
        // 替换原转换逻辑,通过字符差值得到数字
        result[j] = s[j] - '0'; 
    }

    return result; 
}

static void Main(string[] args)
{
    foreach(var item in PlusOne( new int[] {1,2,3,4}))
        Console.WriteLine(item);
}

更优解决方案(彻底避免精度问题)

直接对数组从后往前处理进位,无需转换为数字或字符串,高效且无精度风险:

public static int[] PlusOne(int[] digits)
{
    for (int i = digits.Length - 1; i >= 0; i--)
    {
        if (digits[i] < 9)
        {
            digits[i]++;
            return digits;
        }
        // 当前位为9,加1后置0,继续向前处理进位
        digits[i] = 0;
    }
    // 所有位都是9,需新增一位补1
    int[] newDigits = new int[digits.Length + 1];
    newDigits[0] = 1;
    return newDigits;
}

static void Main(string[] args)
{
    foreach(var item in PlusOne( new int[] {1,2,3,4}))
        Console.WriteLine(item);
}

这个方法的逻辑:

  • 从数组末尾开始遍历,逐位处理加1操作
  • 若当前位小于9,直接加1后返回数组
  • 若当前位是9,置为0并继续向前遍历
  • 若所有位都是9,新建长度+1的数组,首位设为1(比如输入{9,9,9}会输出{1,0,0,0})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:15:38