我正在尝试计算1 + 1 * 2 + 1 * 2 * 3 + 1 * 2 * 3 * 4 + ... + 1 * 2 * ... * n
,其中n
是用户输入。
它适用于最多12个n
的值。我想计算n = 13
,n = 14
和n = 15
的总和。我该如何在C89中做到这一点?据我所知,我只能在C99或C11中使用unsigned long long int
。
我的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned long int n;
unsigned long int P = 1;
int i;
unsigned long int sum = 0;
scanf("%lu", &n);
for(i = 1; i <= n; i++)
{
P *= i;
sum += P;
}
printf("%lu", sum);
return 0;
}
最佳答案
实际上,您需要一些arbitrary precision arithmetic(又称bigint或bignum)库。我的建议是GMPlib,但有other ones。
不要尝试编写自己的bignum库。存在高效且聪明的算法,但是它们不直观且难以掌握(您可以找到有关该问题的整本书)。此外,现有的库(例如GMPlib)正在利用标准C编译器不会发出(来自纯C代码)的特定机器指令(例如ADC -add带进位)。
如果这是一项家庭作业,并且您不允许使用外部代码,请考虑使用一个数字表示基数或radix 1000000000(十亿),然后以非常幼稚的方式为自己编写操作代码,类似于您从小就学到的方法。但是请注意,存在更有效的算法(并且实际的bignum库正在使用它们)。
一个数字可以用unsigned
数组表示为基数1000000000,每个数组都是基数1000000000的“数字”。因此,您需要管理数组(可能使用malloc
分配堆)及其长度。
关于c - 如何求大数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44259619/