C : как правильно распечатать длинный длинный int с помощью cout

#c

#c

Вопрос:

Я написал код для получения факториала числа на C .

Вот код.

  #include <iostream>

 using namespace std;

 unsigned long long getFactorial(int);

 int main(int argc, char **argv) {
         int num = 5;
         unsigned long long factorial = getFactorial(a);

         cout << "Factorial of " << num << ": " << factorial << endl;

         return 0;
 }

 unsigned long long getFactorial(int num) {
         int i;
         unsigned long long factorial = 1;
         for(i=1; i<=num; i  ) {
                 factorial *= i;
         }

         return factorial;
 } 
  

Когда я присваиваю 5 num значению, оно правильно выводит правильное значение, 120. Но когда я назначаю большие числа, например 100, он просто выводит 0. Как я могу изменить код, чтобы правильно распечатать результат на консоли?

Комментарии:

1. uint64_t (8 байт) может содержать около 93 !. 100! просто слишком большой. Попробуйте меньше 92 !, и, возможно, используйте только беззнаковый long long, без целых чисел или чисел со знаком.

2. Для получения более крупных факториалов загляните в gmp (расширенная арифметика точности). Он может обрабатывать 1000 !, и в результате генерирует большую строку.

3. Как вы пришли к выводу 92! может поместиться в 64-битное целое число? Это невозможно. 20! — это предел.

4. fib(93) это предел для 64-битных целых чисел без знака, он, вероятно, просто перепутал их

Ответ №1:

Теперь я сам нашел ответ.

С помощью gmp библиотеки стало намного проще работать с большими целыми числами.

Вот измененный код.

 #include <iostream>
#include <gmpxx.h>

using namespace std;

mpz_class getFactorial(int);

int main(int argc, char **argv) {
        int num = 100;
        mpz_class factorial = getFactorial(num);

        cout << "Factorial of " << num << ": " << factorial << endl;

        return 0;
}

mpz_class getFactorial(int num) {
        int i;
        mpz_class factorial = 1;
        for(i=1; i<=num; i  ) {
                factorial *= i;
        }

        return factorial;
}
  

Чтобы использовать gmp библиотеку, я включил файл <gmpxx.h> заголовка. Затем я изменил тип данных factorial переменной и возвращаемый тип getFactorial() функции с unsigned long long на mpz_class , который является типом данных, представляющим большое целое число.

После изменения кода я скомпилировал его с помощью GCC, используя следующие флаги.

$gcc test.cpp -lstdc -lgmpxx -lgmp -o test

Флаги -lgmpxx и -lgmp требуются для компиляции кода с использованием gmp библиотеки.

Теперь он работает нормально.

Комментарии:

1. Хорошая вещь… вы многому научитесь, когда найдете решение самостоятельно, поздравляю!