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;
}
}