这个问题的重点是想出一种方法来做到这一点,而无需实际计算 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。确实没有理由双重检查需要与实际解决方案使用相同的语言。