這個問題的關鍵在於想出一個不需要實際計算2^1000的方法。
但是,如果你做想計算2^1000,這可能是一個好主意,因爲它是測試你的其他算法是否正確 - 你會想一些「BIGNUM的好方法「庫,如gmp
:
mpz_t two_to_1000;
mpz_ui_pow_ui(two_to_1000, 2, 1000);
或者你可以使用C++ interface來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
爲digitsum
。)
之所以這麼說,我可能就不會寫這gmp
代碼測試它,當整個事情是Python中的一行:
print(sum(map(int, str(2**1000))))
而且,即使將bignum轉換爲字符串以將每個數字轉換爲int來總結它們可能是解決此問題的效率最低的方法,但在我擁有的最慢的計算機上,它仍需要200us以下的時間。而且實際上沒有必要用實際解決方案的相同語言進行雙重檢查。
您不必在C++中做它。關掉我的腦袋,PHP中的'bcpow'會讓你很容易做到這一點。 – zneak
我想過嘗試一個無符號的long long int,但是如果我沒有記錯的話,我只能讀取2^64-1。 –
看起來像來自數學奧林匹克的問題。可能是一個無需編碼就可以獲得它的技巧。 – thang