2

我如何在变量 (i) 中存储大量数字并且不需要更改大部分程序?例如,是否有可用的数据类型来存储 100 的阶乘?

#include<stdio.h>
#include<conio.h>

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();
}
4

2 回答 2

1

@Marcin Łoś 很赚钱,不使用库或滚动您自己的函数就没有 C 解决方案。

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

#include <stdio.h>
#include <string.h>
#include <math.h>

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
于 2013-09-06T04:48:46.023 回答
1

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

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

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

于 2013-08-30T15:10:06.580 回答