C# 两个非常大的数字之和

C# 两个非常大的数字之和,c#,C#,我的任务是把一个很大的数字加到另一个数字上,然后打印结果。 这是我的实现,它应该给1000作为输出,但它写0000 工作原理: 如果两个数字长度相等: 对于数字%10,仅为/10,其余为%10。如果结果的长度大于原始长度,则将最后的余数添加到输出数组的最后一个元素 如果两个数字的长度不同: 求交集部分的和,并将剩余部分(临时)添加到相对补码中 怎么了 static int[] SumOfBigNumbers(int[] firstNumber, int[] secondNumber) {

我的任务是把一个很大的数字加到另一个数字上,然后打印结果。 这是我的实现,它应该给1000作为输出,但它写0000

工作原理: 如果两个数字长度相等: 对于数字%10,仅为/10,其余为%10。如果结果的长度大于原始长度,则将最后的余数添加到输出数组的最后一个元素

如果两个数字的长度不同: 求交集部分的和,并将剩余部分(临时)添加到相对补码中

怎么了

static int[] SumOfBigNumbers(int[] firstNumber, int[] secondNumber)
{
    int temp = 0;
    int maxLength = (Math.Max(firstNumber.Length, secondNumber.Length));
    int minLength = (Math.Min(firstNumber.Length, secondNumber.Length));
    int[] output = new int[maxLength + 1];

    //sum of equal part
    for (int counter = 0; counter < minLength; counter++)
    {
        output[counter] = (firstNumber[counter] + secondNumber[counter] + temp) % 10;
        temp = (firstNumber[counter] + secondNumber[counter] + temp) / 10;
    }
    //exceptions add the temp to the bigger array
    if (temp!=0)
    {
        //if first array is bigger than the second
        if (firstNumber.Length > secondNumber.Length)
        {
            for (int i = minLength; i < maxLength + 1; i++)
            {
                output[i] = (firstNumber[i] + temp) % 10;
                temp = (firstNumber[i] + temp) / 10;
            }
        }
        //if second array is bigger than the first
        else if (firstNumber.Length < secondNumber.Length)
        {
            for (int i = minLength; i < maxLength + 1; i++)
            {
                output[i] = (secondNumber[i] + temp) % 10;
                temp = (secondNumber[i] + temp) / 10;
            }
        }
        //if two number has equal length but there is temp left
        else
        {
            output[maxLength] = temp;
        }
    }
    return output;
}
static void Main()
{
    int[] firstArray = new int[3] { 0, 0, 5 };
    int[] secondArray = new int[3] { 0, 0,5 };
    int[] output = SumOfBigNumbers(firstArray, secondArray);
    foreach (var i in output)
    {
        Console.WriteLine(output[i]);
    }
}
static int[]SumOfBigNumbers(int[]firstNumber,int[]secondNumber)
{
内部温度=0;
int maxLength=(Math.Max(firstNumber.Length,secondNumber.Length));
int minLength=(Math.Min(firstNumber.Length,secondNumber.Length));
int[]输出=新的int[maxLength+1];
//等分之和
用于(int计数器=0;计数器secondNumber.Length)
{
对于(int i=minLength;i

编辑:如果复制任务,效果更好:编写一个计算两个非常长的正整数之和的方法。数字表示为数组数字,最后一个数字存储在数组中的索引0处。使该方法适用于长度不超过10000位的所有数字。

虽然BigInteger是处理大数字的更好方法,但我认为您在打印输出时遇到了错误。试试这个:

foreach (var i in output)
{
  Console.WriteLine(i);
}

此外,这将打印
0001
,最好在打印时将其反转虽然biginger是处理大数字的更好方法,但我认为您在打印输出时存在错误。试试这个:

foreach (var i in output)
{
  Console.WriteLine(i);
}

此外,这将打印
0001
,最好在打印时将其反转

您的代码工作正常,但在显示
输出
数组时出现了一个小错误

您对每个(输出中的变量i)执行
foreach{
,但您使用
i
作为索引,而它不是。它已经是实际值。只需将
i
写入控制台即可

foreach (var i in output)
{
    Console.WriteLine(i);
}

// Output:
// 0
// 0
// 0
// 1
或者使用
for
循环按索引遍历数组

for (int i = 0; i < output.Length; i++)
{
    Console.WriteLine(output[i]);
}

// Output:
// 0
// 0
// 0
// 1
for(int i=0;i
您的代码工作正常,但您在显示
输出
数组时出现了一个小错误

您对每个(输出中的变量i)执行
foreach{
,但您使用
i
作为索引,而它不是。它已经是实际值。只需将
i
写入控制台即可

foreach (var i in output)
{
    Console.WriteLine(i);
}

// Output:
// 0
// 0
// 0
// 1
或者使用
for
循环按索引遍历数组

for (int i = 0; i < output.Length; i++)
{
    Console.WriteLine(output[i]);
}

// Output:
// 0
// 0
// 0
// 1
for(int i=0;i
可能是你正在寻找的,可能只是我,但我不明白为什么
{0,0,5}+{0,0,5}
会导致
{1,0,0,0}
。如果
{5,0,0}+{5,0,0,0}
对我来说是有意义的。也许我误解了这个任务。我把它读作第0个元素0,第1个(十)元素0,第2个元素(数百)依此类推。使用此逻辑,输出应该是0001,稍后可以反转。@Filburt索引越高,值越重要。可能是您正在寻找的,可能只是我,但我不理解为什么
{0,0,5}+{0,0,5}
会导致
{1,0,0,0,0}
,如果
{5,0,0}+{5,0,0}
这对我来说很有意义。也许我误解了任务。我把它理解为第0个元素(一个)0,第1个元素(十个)0,第2个元素(百个)依此类推。使用此逻辑,输出应为0001,稍后可以反转。@Filburt索引越高,值越重要。关于反转顺序,公平点。关于您编写的代码,与我在底部的代码不一样吗?在您的问题中,您试图输出输出的第I个元素(输出[I])我实际上是数字本身,而不是索引,尝试将数组中的5中的一个改为4,你会看到索引超出边界,例外点是关于颠倒顺序的。关于你写的代码,它和我在底部的代码不一样吗?在你的问题中,你试图输出输出的第i个元素(output[i])我实际上是数字本身,而不是索引,尝试将数组中的5中的一个更改为4,您将看到索引超出范围,除非您提供详细答案!现在我了解了错误的原因。我认为foreach与任何其他循环一样工作,如simple for()。感谢您提供的详细答案!现在我了解了错误的原因。我认为foreach与任何其他循环一样工作,如simple for()。