C# 表示为数组的大数之和?

C# 表示为数组的大数之和?,c#,arrays,methods,C#,Arrays,Methods,数字以相反的顺序存储在数组中。下面是一个函数,它应该添加两个数字,a和b,并将总和存储在结果中: public static void SumDigitArraysDifferentSize(int[] a, int[] b, int[] result) { int length = Math.Max(a.Length, b.Length); for (int i = 0; i < length; i++) { int lhs = (

数字以相反的顺序存储在数组中。下面是一个函数,它应该添加两个数字,
a
b
,并将总和存储在
结果中:

public static void SumDigitArraysDifferentSize(int[] a, int[] b, int[] result)
{
      int length = Math.Max(a.Length, b.Length);
      for (int i = 0; i < length; i++)
      {
          int lhs = (i < a.Length) ? a[i] : 0;
          int rhs = (i < b.Length) ? b[i] : 0;

          result[i] = (result[i] + lhs + rhs) % 10;

          int carry = (result[i] + lhs + rhs) / 10;

          for (int j = 1; carry > 0; j++)
          {
              result[i + j] = (result[i + j] + carry) % 10;

              carry = (result[i + j] + carry) / 10;
          }
      }
}
结果是:

{ 8, 1, 1 }
而不是预期的:

{ 8, 0, 1 }
我做错了什么?
对于MCVE:

public static void PrintArray(int[] Array)
{
    Console.Write("{");
    int length = Array.Length;
    for (int i = 0; i < length; i++)
    {
        Console.Write(Array[i]);

        if (i < length - 1)
        {
             Console.Write(", ");
        }
    }
    Console.Write("}\n");
}
publicstaticvoidprintary(int[]数组)
{
控制台。写(“{”);
int length=Array.length;
for(int i=0;i
您正在分配
结果[i]
,并在计算
进位时再次使用该结果

这:

应该是:

      var sum = result[i] + lhs + rhs;
      result[i] = (sum) % 10;
      int carry = (sum) / 10;

(int j=1;…)

中的计算也是如此。为了完整起见,以下是注释部分建议的(由@Lasse V.Karlsen)实施的结果

public static void SumDigitArrays(int[] a, int[] b, int[] result)
{
    int length = Math.Max(a.Length, b.Length);
    for (int i = 0; i < length; i++)
    {
        int lhs = (i < a.Length) ? a[i] : 0;
        int rhs = (i < b.Length) ? b[i] : 0;

        int sum = result[i] + lhs + rhs;
        result[i] = sum % 10;

        int carry = sum / 10; 
        result[i + 1] = result[i + 1] + carry;
    }
}
publicstaticvoidsumdigitarrays(int[]a,int[]b,int[]result)
{
int length=Math.Max(a.length,b.length);
for(int i=0;i
在检查进位之前,您将分配给
结果[i+j]
,这是一个错误。您应该首先计算要放入
结果[i+j]
,然后计算进位,然后将其放入
结果[i+j]
。因为我不确定这是唯一的错误,所以我不会把它作为一个答案。您是否考虑过让
进位
作为一个简单的变量在迭代之间进行,而不是让一个单独的循环将进位扩展到相邻的值?行
int length=Math.Max(a.length,b.length)
可以更改以获取数组的长度,因为它已经与该数组返回的值相同line@LasseV.Karlsen谢谢你的评论,是的,首先,进位只是外部循环中的一个简单变量。不要更改问题,这样答案就无效了。哦,
结果[i]
进位计算中的
是第一次赋值后的更新值。谢谢
      var sum = result[i] + lhs + rhs;
      result[i] = (sum) % 10;
      int carry = (sum) / 10;
public static void SumDigitArrays(int[] a, int[] b, int[] result)
{
    int length = Math.Max(a.Length, b.Length);
    for (int i = 0; i < length; i++)
    {
        int lhs = (i < a.Length) ? a[i] : 0;
        int rhs = (i < b.Length) ? b[i] : 0;

        int sum = result[i] + lhs + rhs;
        result[i] = sum % 10;

        int carry = sum / 10; 
        result[i + 1] = result[i + 1] + carry;
    }
}