我知道有一种方法可以使用Python找到100!(或任何其他大数字的阶乘)的数字之和。但是我发现在C ++方面真的很难,因为即使 LONG LONG 的大小还不够。
我只想知道是否还有其他方法。
我知道它不可能,因为我们的处理器通常是32位。我所指的是其他一些棘手的技术或算法,可以使用相同的资源完成相同的工作。
答案 0 :(得分:16)
使用带有标准的纸上乘法方法的数字数组。例如,在C:
中#include <stdio.h>
#define DIGIT_COUNT 256
void multiply(int* digits, int factor) {
int carry = 0;
for (int i = 0; i < DIGIT_COUNT; i++) {
int digit = digits[i];
digit *= factor;
digit += carry;
digits[i] = digit % 10;
carry = digit / 10;
}
}
int main(int argc, char** argv) {
int n = 100;
int digits[DIGIT_COUNT];
digits[0] = 1;
for (int i = 1; i < DIGIT_COUNT; i++) { digits[i] = 0; }
for (int i = 2; i < n; i++) { multiply(digits, i); }
int digitSum = 0;
for (int i = 0; i < DIGIT_COUNT; i++) { digitSum += digits[i]; }
printf("Sum of digits in %d! is %d.\n", n, digitSum);
return 0;
}
答案 1 :(得分:14)
你怎么能找到100的数字之和!如果计算100!首先,然后找到总和,然后是什么意思。您将不得不使用一些智能逻辑来找到它而不实际计算100!删除所有五个因子,因为它们只会添加零。从这个方向思考,而不是考虑大数字。另外我确定最后的答案,即数字的总和将在LONG LONG内。
有C ++大型int库,但我认为这里的重点是算法而不是库。
答案 2 :(得分:6)
如果您指的是Project Euler问题,那么我的阅读就是它希望您编写自己的任意精度整数库或可以乘以数字的类。
我的建议是存储一个数字的基数为10的数字,与您正常编写它们的方式相反,因为无论如何您最终都需要将数字转换为10。在我看来,以相反的顺序存储数字使得添加和乘法程序稍微容易一些。然后编写加法和乘法例程,模拟如何手动添加或乘以数字。
答案 3 :(得分:6)
long long
不是C ++的一部分。 g ++将其作为扩展名提供。
Arbitrary Precision Arithmetic是您正在寻找的东西。查看维基页面中给出的伪代码。
此外long long
无法存储如此大的值。因此,您可以创建BigInteger类,也可以使用某些第三方库,例如GMP或C++ BigInteger。
答案 4 :(得分:5)
观察将任意数字乘以 10 或 100 不会改变数字的总和。
一旦你意识到这一点,看到乘以2和5,或乘以20和50,也不会改变总和,因为 2x5 = 10 和 20x50 = 1000
然后注意,当你的当前计算以0结束时,你可以简单地除以10,并继续计算你的阶乘。
再做一些关于快捷方式的观察,以消除1到100之间的数字,我认为您可以将答案纳入标准整数。
答案 5 :(得分:4)
C ++中有许多BigInteger库。只是谷歌“C ++ BigInteger”。但如果这是一个编程竞赛问题,那么你最好尝试实现自己的BigInteger库。
答案 6 :(得分:1)
项目Euler中的任何内容都不需要__int64。
我建议尝试使用base 10000。
答案 7 :(得分:0)
你可以采取简单的方法,并使用perl / python / lisp / scheme / erlang / etc来计算100!使用其中一个内置的bignum库或某些语言使用精确的整数运算。然后取这个数字,将它存储到一个字符串中,找到字符的总和(占'0'= 48等)。
或者,你可以考虑在100!中,你会得到一个非常大的数字,有许多零。如果计算100!迭代地,每当当前阶乘被10整除时,考虑除以10.我相信这将产生长期或某种范围内的结果。
或者,可能更好的练习是编写自己的大型int库。如果你不确定聪明的技巧,你将需要它来解决一些问题。