Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
c__
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 8
#1

Факториал большого числа - C++

23.10.2013, 18:22. Просмотров 953. Ответов 6
Метки нет (Все метки)

Доброго времени суток!
Захотелось вычислить факториал большого числа. Наткнулся на gmp. Посмотрел это http://www.cyberforum.ru/blogs/131347/blog488.html и доку. Получилось так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <gmp.h>
#include <gmpxx.h>
 
int main()
{
  std::cout << "Введите n:\n";
  unsigned long int n;
  std::cin >> n;
  mpz_t result;
  mpz_init(result);
  unsigned long int one = 1;
  mpz_set_ui(result, one);
  for(unsigned long i = n; i >= 0; i--)
    mpz_mul_ui(result, result, i); 
  gmp_printf("n! = %Zd\n", result);
  mpz_clear(result);
}
Компилирую так: g++ -std=c++11 -o fact fact.cpp -lgmpxx -lgmp. Все собирается, но после ввода числа зависает. Подскажите, пожалуйста, в чем трабл!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2013, 18:22     Факториал большого числа
Посмотрите здесь:

факториал числа. я начинающий C++
C++ факториал макс. числа
C++ Выдать факториал числа
C++ Вывести факториал числа
1% от большого числа C++
C++ Факториал числа
Факториал числа C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Hunter13ua
46 / 46 / 5
Регистрация: 25.10.2011
Сообщений: 183
23.10.2013, 18:38     Факториал большого числа #2
Не разбираюсь в библиотеке gmp. Однако без неё - более чем реально.
1. Длинная арифметика. Нужна операция ввода, вывода, умножения -> факториал.
2. Факториал можно вычислить почти до 30ти примитивными типами. Хранить в типе unsigned long long и убирать нули в числе, считая их и запоминая.
c__
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 8
23.10.2013, 18:59  [ТС]     Факториал большого числа #3
Цитата Сообщение от Hunter13ua Посмотреть сообщение
Не разбираюсь в библиотеке gmp. Однако без неё - более чем реально.
1. Длинная арифметика. Нужна операция ввода, вывода, умножения -> факториал.
2. Факториал можно вычислить почти до 30ти примитивными типами. Хранить в типе unsigned long long и убирать нули в числе, считая их и запоминая.
Думал об этом, но хочется разобраться с gmp.
Avazart
7044 / 5221 / 259
Регистрация: 10.12.2010
Сообщений: 22,947
Записей в блоге: 17
23.10.2013, 19:04     Факториал большого числа #4
Ошибка банальная, в цикле - i без знаковое, значит неотрицательное...
C++
1
2
for(unsigned long i=n; i!=0; i--)
        mpz_mul_ui(result, result, i);
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
23.10.2013, 19:08     Факториал большого числа #5
c__,
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <gmp.h>
int main()
{
  std::cout << "Введите n:\n";
  unsigned long int n;  std::cin >> n;
  mpz_t result; mpz_init(result);
 
  mpz_fac_ui(result, n);
  gmp_printf("n! = %Zu\n", result);
  mpz_clear(result);
}
для факториала есть спец.функции. Раздел 5.9 - Number Theoretic Functions.
Миниатюры
Факториал большого числа   Факториал большого числа  
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
23.10.2013, 19:13     Факториал большого числа #6
И да, если используете чисто Сишные функции, то включать <gmpxx.h> и линковать -lgmpxx нет смысла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2013, 19:17     Факториал большого числа
Еще ссылки по теме:

C++ факториал числа
Факториал числа C++
C++ Рекурсия: факториал числа
C++ Вычислить факториал числа
Как посчитать факториал большого числа, если диапазон типа данных (int) ограничен? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
c__
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 8
23.10.2013, 19:17  [ТС]     Факториал большого числа #7
Цитата Сообщение от Avazart Посмотреть сообщение
Ошибка банальная, в цикле - i без знаковое, значит неотрицательное...
Код C++
1
2
for(unsigned long i=n; i != 0; i--)
* * * * mpz_mul_ui(result, result, i);
Спасибо, не знал. Рабочий вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <gmp.h>
#include <gmpxx.h>
 
int main()
{
  std::cout << "Введите n:\n";
  unsigned long int n;
  std::cin >> n;
  mpz_t result;
  mpz_init(result);
  unsigned long int one = 1;
  mpz_set_ui(result, one);
  for(unsigned long int i = 1; i <= n; i++)
    mpz_mul_ui(result, result, i);
  gmp_printf("n! = %Zd\n", result);
  mpz_clear(result);
}
Добавлено через 2 минуты
Цитата Сообщение от gromo Посмотреть сообщение
c__,
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <gmp.h>
int main()
{
  std::cout << "Введите n:\n";
  unsigned long int n;  std::cin >> n;
  mpz_t result; mpz_init(result);
 
  mpz_fac_ui(result, n);
  gmp_printf("n! = %Zu\n", result);
  mpz_clear(result);
}
для факториала есть спец.функции. Раздел 5.9 - Number Theoretic Functions.
Спасибо. Для числа Эйлера пригодиться.
Yandex
Объявления
23.10.2013, 19:17     Факториал большого числа
Ответ Создать тему
Опции темы

Текущее время: 01:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru