我正在尝试计算1 + 1 * 2 + 1 * 2 * 3 + 1 * 2 * 3 * 4 + ... + 1 * 2 * ... * n
,其中n
是用户输入。它适用于n
到12的值。我想计算n = 13
、n = 14
和n = 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;
}
3条答案
按热度按时间ergxz8rk1#
实际上,您需要一些arbitrary precision arithmetic(也称为 bigint 或 bignum)库。
不要试图编写你自己的bignum库。高效和聪明的算法是存在的,但它们不直观,很难掌握(你可以找到整本书专门讨论这个问题)。此外,现有的库,如GMPlib,正在利用特定的机器指令(如ADC-add with carry),标准C编译器不会发出(从纯C代码)。
如果这是一个家庭作业,并且不允许使用外部代码,那么可以考虑用base或radix 1000000000(十亿)表示一个数字,然后用一种非常幼稚的方式编写操作代码,就像你小时候学过的一样。但是要注意,还有更高效的算法存在(并且真实的的bignum库正在使用它们)。
一个数字可以用
unsigned
数组来表示(基数为1000000000),每个数组都是基数为100000000的“数字”。因此,您需要管理数组(可能是堆分配的,使用malloc
)及其长度。ee7vknir2#
您可以使用
double
,特别是如果您的平台使用IEEE754。这样的
double
提供了53位的精度,这意味着整数精确到2的53次幂。如果您的平台不使用IEEE754,请查阅所采用的浮点方案的文档。它 * 可能 * 足够了。
nqwrtyyt3#
当您刚刚超过MaxInt的限制时,是对10^n取模,得到一个合适的n,你做的计算和浮点计算一样,但是你把所有的都除以10^r,前一个结果会给予你前n位数,后一个结果会给你答案的最后一位数,去掉前r位数。那么由于舍入误差,这里的最后几位数将不准确,所以您应该选择比n小一点的r。在这种情况下,取n = 9和r = 5将很好。