Найти факториал 500 и сохранить его в переменной и произвести вычисления Как сохранить такое огромное число?

как мне сохранить огромное число в переменной (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();
}

person user2733346    schedule 30.08.2013    source источник
comment
Для этого вам нужно будет произвести расчет большого числа.   -  person Jiminion    schedule 30.08.2013
comment
возможный дубликат суммы цифр факториала   -  person Eric Postpischil    schedule 30.08.2013
comment
Вот хорошее объяснение одного алгоритма: stackoverflow.com/q/2127540/2186301 Надеюсь, это поможет вам или принесет вам какая-то идея;)   -  person yulian    schedule 30.08.2013
comment
Человек по имени Мохаммад Шафиениа написал статью «1000 Factorial». Прочтите об алгоритме и скачайте исходный код. Надеюсь, эта статья вам поможет! Ссылка: codeproject.com/Articles/38504/1000-Factorial   -  person yulian    schedule 30.08.2013


Ответы (2)


Для таких больших чисел нет встроенной языковой поддержки. У вас есть два варианта:

  • по возможности используйте существующую библиотеку, например GMP
  • реализовать собственное решение

Если вы решите пойти по второму пути, вы можете рассмотреть возможность хранения цифр (не обязательно десятичных) в массиве и выполнять арифметические операции с использованием хорошо известных школьных алгоритмов. Имейте в виду, что он будет (вероятно, значительно) менее эффективным, чем сильно оптимизированный библиотечный код.

person Marcin Łoś    schedule 30.08.2013
comment
Актуальная проблема не в том, чтобы вычислить 500 !; это сумма цифр 500 !. Это задача упражнения или конкурса. - person Eric Postpischil; 30.08.2013
comment
@EricPostpischil, я полагаю, это умножение цифр на 500. - person yulian; 30.08.2013

@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
person chux - Reinstate Monica    schedule 06.09.2013