要找到500的阶乘并将其存储在变量中……并执行计算…如何存储如此庞大的数字?

如何在变量(i)中存储大量数字并且不需要更改程序的大部分内容? 例如,是否存在可用的因子存储数据类型?

#include #include void main() { long long int i = 1; long long int sum = 0; long long int j = 0; long long int digit = 0; for(j = 500; j >= 1; j--) { i = i * j; } printf("%lld", i); while(i > 0) { digit = i%10; i = i/10; sum = sum + digit; } printf("\n%lld", sum); getch(); } 

对于如此大的数字,没有内置语言支持。 你有两个选择:

  • 如果可以,请使用现有的库,如GMP
  • 实施自己的解决方案

如果您决定采用第二条路径,您可能需要考虑在数组中存储数字(不一定是十进制),并使用众所周知的学校算法执行算术运算。 请记住,与大量优化的库代码相比,它(可能相当大)效率低。

@MarcinŁoś没有使用库或滚动自己的function,没有C解决方案。

Follows是一个有趣但不富有想象力的解决方案,其中大数字存储为char数组(按相反顺序)。

 #include  #include  #include  void Mult(char *BigNum, unsigned Factor) { unsigned Accumulator = 0; char Digit; while ((Digit = *BigNum) != '\0') { Accumulator += ((unsigned)(Digit - '0')) * Factor; *BigNum++ = Accumulator%10 + '0'; Accumulator /= 10; } while (Accumulator > 0) { *BigNum++ = Accumulator%10 + '0'; Accumulator /= 10; } *BigNum = '\0'; } int main(){ unsigned N = 500; unsigned Factor; char BigNum[(size_t) (N*log(N) + 2)]; // Form answer, in reverse order, as a string strcpy(BigNum, "1"); for (Factor = 1; Factor <= N; Factor++) { Mult(BigNum, Factor); } printf("%u! Length:%zu Reverse:\"%s\"\n", Factor - 1, strlen(BigNum), BigNum); unsigned long Sum = 0; size_t i; for (i=0; BigNum[i]; i++) { Sum += BigNum[i] - '0'; } printf("Sum of digits:%lu\n", Sum); return 0; } 500! Length:1135 Reverse:"000...221" Sum of digits:4599