C语言 如何求大数的和?

thtygnil  于 2022-12-03  发布在  其他
关注(0)|答案(3)|浏览(180)

我正在尝试计算1 + 1 * 2 + 1 * 2 * 3 + 1 * 2 * 3 * 4 + ... + 1 * 2 * ... * n,其中n是用户输入。它适用于n到12的值。我想计算n = 13n = 14n = 15的总和。如何在C89中执行此操作?据我所知,unsigned long long int只能在C99或C11中使用。
1.输入13,结果2455009817,预期值6749977113
1.输入14,结果3733955097,预期值93928268313
1.输入15,结果1443297817,预期值1401602636313
我的代码:

#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;
}
ergxz8rk

ergxz8rk1#

实际上,您需要一些arbitrary precision arithmetic(也称为 bigintbignum)库。
不要试图编写你自己的bignum库。高效和聪明的算法是存在的,但它们不直观,很难掌握(你可以找到整本书专门讨论这个问题)。此外,现有的库,如GMPlib,正在利用特定的机器指令(如ADC-add with carry),标准C编译器不会发出(从纯C代码)。
如果这是一个家庭作业,并且不允许使用外部代码,那么可以考虑用base或radix 1000000000(十亿)表示一个数字,然后用一种非常幼稚的方式编写操作代码,就像你小时候学过的一样。但是要注意,还有更高效的算法存在(并且真实的的bignum库正在使用它们)。
一个数字可以用unsigned数组来表示(基数为1000000000),每个数组都是基数为100000000的“数字”。因此,您需要管理数组(可能是堆分配的,使用malloc)及其长度。

ee7vknir

ee7vknir2#

您可以使用double,特别是如果您的平台使用IEEE754。
这样的double提供了53位的精度,这意味着整数精确到2的53次幂。
如果您的平台不使用IEEE754,请查阅所采用的浮点方案的文档。它 * 可能 * 足够了。

nqwrtyyt

nqwrtyyt3#

当您刚刚超过MaxInt的限制时,是对10^n取模,得到一个合适的n,你做的计算和浮点计算一样,但是你把所有的都除以10^r,前一个结果会给予你前n位数,后一个结果会给你答案的最后一位数,去掉前r位数。那么由于舍入误差,这里的最后几位数将不准确,所以您应该选择比n小一点的r。在这种情况下,取n = 9和r = 5将很好。

相关问题