この問題の要点は、実際に2^1000を計算せずにこれを行う方法を考え出すことです。
ただし、 2 ^ 1000を計算する場合は(他のアルゴリズムが正しいかどうかをテストするための優れた方法であるため、これは良い考えです)、次のような「bignum」ライブラリが必要になりますgmp
。
mpz_t two_to_1000;
mpz_ui_pow_ui(two_to_1000, 2, 1000);
または、C++インターフェイスを使用してgmp
。べき乗を行わないため、最初の部分は少なくなるのではなく少し複雑になりますが、桁の合計が簡単になります。
mpz_class two_to_1000;
mpz_ui_pow_ui(two_to_1000.get_mpz_t(), 2, 1000);
mpz_class digitsum(0);
while (two_to_1000) {
digitsum += two_to_1000 % 10;
two_to_1000 /= 10;
}
(実際にそこに作成digitsum
する理由はないmpz
ので、結果が32ビットに収まることを証明する方法を理解し、それをコメントとして追加して、long
forを使用することをお勧めしますdigitsum
。)
gmp
そうは言っても、Pythonですべてがワンライナーである場合、テストするためにこのコードを作成することはおそらくなかったでしょう。
print(sum(map(int, str(2**1000))))
そして、bignumを文字列に変換して各桁をintに変換して合計するのはおそらく最も効率の悪い方法ですが、ここにある最も遅いマシンでは200us未満かかります。また、ダブルチェックを実際のソリューションと同じ言語にする必要がある理由は実際にはありません。