2

私はプロジェクトのオイラー問題 16 を解決しましたが、このかなり斬新なアプローチを発見しましたが、使用されている手法について理解できません ( http://www.mathblog.dk/project-euler-16/から):

int result = 0;

BigInteger number = BigInteger.Pow(2, 1000);

while (number > 0) {
    result += (int) (number % 10);
    number /= 10;
}

私のバージョンはより従来のように見えますが、上記のアプローチの方がクールだと思います。

var result = BigInteger
    .Pow(2, 1000)
    .ToString()
    .Aggregate(0, (total, next) => total + (int) Char.GetNumericValue(next));

数学は最初のアプローチでどのように機能しますか、それはクールですが、理解するのに役立つ説明が必要なので、誰かが親切に説明してくれたら本当にありがたいです.

注: 間違ったセクションに投稿した場合は、より適切な質問先をお知らせください。

4

5 に答える 5

6

value % 10最後の桁 (10 で割った余り) を返します。整数を 10 で割ると、この数値が削除されます。

数値をリストと考えてください。リストをデキューして値を合計しているだけです。

于 2012-08-15T15:10:51.513 に答える
4

剰余演算子は、除算の余りを提供します。ですから、mod10がその数の中で1位になります。10で整数を除算すると、すべてがシフトされるため、繰り返すことができます。

番号12345の例:

12345 % 10 = 5
12345 / 10 = 1234
 1234 % 10 = 4
 1234 / 10 = 123
  123 % 10 = 3
  123 / 10 = 12
   12 % 10 = 2
   12 / 10 = 1
    1 % 10 = 1
    1 / 10 = 0 (loop ends)

加算は各係数の結果に対して実行されるため、次のようになります。5+4+3+2+1

于 2012-08-15T15:15:44.990 に答える
2

number % 1010 進数の最下位桁を抽出します。例12345=>5

number / 1010 進数の最下位桁を削除します。これが機能するのは、C# の整数除算が剰余を捨てるためです。例12345=>1234

したがって、上記のコードは各桁を抽出し、合計に追加してから削除します。すべての数字が削除され、数字が になるまで、このプロセスが繰り返されます0

于 2012-08-15T15:11:57.703 に答える
1
  1. 彼らは数 2^1000 を見つけました。

  2. モジュロ 10 は最下位桁を取得します。EG 12034 % 10 = 4

  3. 10 で割ると、最下位桁が取り除かれます。EG 12034 / 10 = 1203

  4. これらの最下位桁を合計します。

于 2012-08-15T15:11:42.743 に答える
1

それは非常に簡単です:

これを想像してください:

数 = 54

モジュロを使用して、これを 10 で割った余りを取得します。

例: 54 / 10 = 5 余り 4

次に、この数字 (4) を結果に追加し、数値を 10 で除算します (小数点以下を破棄する int に格納します)。

したがって、数値 = 5

再び同じ、5 / 10 = 0 余り 5

それらを合計すると、結果は9になりました

数字が 0 になるまで続きます :)

(この場合は 9 が答えです)

于 2012-08-15T15:12:18.453 に答える