两个真正大数字的总和

时间:2016-08-25 14:11:45

标签: c#

我的任务是向另一个添加一个非常大的数字并打印结果。 这是我的实现,它应该输出1000作为输出,但它写入0000。

它应该如何运作: 如果两个数字的长度相等: 只有/ 10表示剩下的数字%10。如果结果的长度大于原始值,则将最后一个余数添加到输出数组的最后一个元素。

如果两个数字的长度不同: 对交叉部分求和并将余数(以temp为单位)加到相对的补码上。

有什么问题?

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

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

2 个答案:

答案 0 :(得分:3)

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

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

这也会打印0001,最好在打印时将其反转

答案 1 :(得分:0)

您的代码工作正常,但您有一个小错误,您可以在其中显示output数组。

您执行了foreach (var i in output) {,但是使用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