2016-08-25 12 views
0

私の仕事は、非常に大きな数値を別の数値に加えて結果を印刷することです。 は、ここでは出力として1000年を与える必要があり、私の実装ですが、それは0000それがどのように動作するかをC#2つの本当に大きな数字の合計

を書き込みます: ちょうど/ 10残りの桁の10%のための2つの数が等しい長さを有する 場合。結果の長さが元の文字数より大きい場合は、最後の剰余を出力配列の最後の要素に追加します。

2つの数値の長さが異なる場合: 交差部分を合計し、余り(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]); 
    } 
} 

*タスクをコピーすると編集が改善されます。2つの非常に長い正の整数の合計を計算する方法を記述します。数値は配列の桁で表され、最後の桁(1のもの)は配列0のインデックスに格納されます。最大10,000桁までの長さのすべての数値に対してメソッドが機能するようにします。

+1

(.aspxのhttps://msdn.microsoft.com/en-us/library/system.numerics.biginteger(V = vs.110))[ 'BigInteger']かもしれない、あなたがこれまで見ているものです –

+1

それはちょうど私ですが、 '{0,0,5} + {0,0,5}'が '{1,0,0,0}'になる理由を理解できません。それが '{5,0,0} + {5,0,0}'ならば私には意味があります。 – Filburt

+0

多分私はその仕事を誤解しました。 0番目の要素(1)0,1番目(10番目)の要素0,2番目の要素(数百)などと読む。このロジックでは、後で反転することができる出力が0001になります。 –

答えて

0

を印刷しながら、それを逆に良く、0001を印刷します:これを試してみてください。

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 
+0

詳細な回答ありがとうございます!今私はエラーの原因を理解しています。私はforeachがfor()のような他のループとして動作すると思った。 –

2

BigIntegerは大きな数字を処理するより優れた方法ですが、出力を印刷するときにバグがあると思います。

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

も、これはあなたのコードは正常に動作しますが、あなたは、あなたがoutput配列を表示する小さなバグがあり

+0

逆順の公正点。あなたが書いたコードについては、私が底にあるように同じではありませんか? –

+0

あなたは出力の** i **番目の要素(出力[i])を出力しようとしています** ** **実際にはインデックス自体ではなく数字です** ** 5 * * ** 4 **への配列で、インデックス外の例外が表示されます – tonakai

+0

Maartenの回答後、私はその違いを見つけました... –

関連する問題