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
相关产品推荐
相关产品推荐

