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

Факториал - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Sithis
10 / 1 / 0
Регистрация: 27.11.2011
Сообщений: 98
14.08.2012, 11:59     Факториал #1
Дано целое число N (> 0). Найти двойной факториал N:
N!! = N•(N–2)•(N–4)•…
(последний сомножитель равен 2, если N — четное, и 1, если N — нечетное). Чтобы избежать целочисленного переполнения, вычислять это произведение с помощью вещественной переменной и вывести его как вещественное число.
Помогите пожалуйста с задачей
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2012, 11:59     Факториал
Посмотрите здесь:

C++ факториал
C++ Факториал (n-1)!
факториал в с++ C++
C++ Факториал
C++ Факториал Си
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.08.2012, 12:15     Факториал #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <iomanip>
 
double ffact(int n)
{
  double prod = 1;
  for (; n > 0; n -= 2) {
    prod *= n;
  }
  return prod;
}
 
int main()
{
  std::cout << std::setprecision(16) << ffact(20);
}
-=ЮрА=-
Заблокирован
Автор FAQ
14.08.2012, 13:21     Факториал #3
Sithis, будьте внимательны с кодом
~OhMyGodSoLong~, т.к. результат его код выдаёт неверный, сравни ответ для ffact(5) (он составит 15) http://liveworkspace.org/code/9611d8...44b540ea7ccc28
со скриншотом проверки работы алгоритма в MathCAD


Не по теме:

PS:Sithis, главное не говори ~OhMyGodSoLong~, что у него косяк, а то он потом нервничает...

Миниатюры
Факториал  
Thinker
14.08.2012, 13:29
  #4

Не по теме:

-=ЮрА=-, посмотрите определение понятия двойного факториала. Так что у ~OhMyGodSoLong~ все верно

-=ЮрА=-
14.08.2012, 13:33
  #5

Не по теме:

Цитата Сообщение от Thinker Посмотреть сообщение
-=ЮрА=-, посмотрите определение понятия двойного факториала. Так что у ~OhMyGodSoLong~ все верно
- я понимаю запись в маткаде 5!! = большому числу, ещё раз повторюсь скриншотом(или MathCAD неверно считает)
ИМХО в задании написано N!! тогда поправить запись надо...

defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
14.08.2012, 13:34     Факториал #6
5*3*1=15
ForEveR
14.08.2012, 13:35
  #7

Не по теме:

-=ЮрА=-, Ну дык N!! != (N!)! не так-ли?

Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
14.08.2012, 13:37     Факториал #8
По определению
http://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
n!! = \left{<br />
\begin{array}{cc}<br />
n(n-2)...1, & n - odd \\<br />
n(n-2)...2, & n - even<br />
\end{array}<br />
\right.<br />
-=ЮрА=-
14.08.2012, 13:43
  #9

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
-=ЮрА=-, Ну дык N!! != (N!)! не так-ли?
- ну дык, посомтри последний скриншот

rinat_w
89 / 85 / 4
Регистрация: 13.11.2011
Сообщений: 183
14.08.2012, 13:59     Факториал #10
-=ЮрА=-, если хочешь взять факториал два раза то пишется вот так : (5!)! очень большое число, а если двойной факториал то : 5!! = 5*3*1 как-то так, а mathcad вычисляет (5!)!
-=ЮрА=-
Заблокирован
Автор FAQ
14.08.2012, 14:20     Факториал #11
Цитата Сообщение от rinat_w Посмотреть сообщение
-=ЮрА=-, если хочешь взять факториал два раза то пишется вот так : (5!)! очень большое число, а если двойной факториал то : 5!! = 5*3*1 как-то так, а mathcad вычисляет (5!)!
- хорошо допустим что так, тогда вопрос снят, приношу свои извинения.
Если это
Цитата Сообщение от Sithis Посмотреть сообщение
N!! = N•(N–2)•(N–4)•…
действительно так, тогда пределагаю рекурсивный вариант вычисления
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
double fact(unsigned int val)
{
    double res = val ? val : 1;
    if(1 < (val -= 2))
        res *= fact(val);
    return res;
}
 
int main()
{
    unsigned int value;
    cout<<"Enter value : ";
    if(!(cin>>value))
        cout<<"Incorrect input\n";
    else
        cout<<fact(value)<<endl;
    return 0;
}
(его отработка будет аналогичной работе алгоритма во 2-м посте)
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.08.2012, 15:08     Факториал #12

Не по теме:

Показывать рекурсию на примере итеративного факториала — это полезно разве что для демонстрации хвостовой рекурсии и смежных тем. Лучше бы в учебниках рекурсию показывали на примере обхода дерева или там поиска в глубину — раз в пять логичнее.


0!! и 0! принимаются равными единице, если что.

Ваш вариант падает с сегфолтом при попытке вычислить fact(1) и fact(0). Наверное, потому что 1U – 2 = 4294967294 и стека не хватает, чтобы вместить 2 миллиарда рекурсивных вызовов. Аккуратнее с unsigned надо быть. И лучше не пытаться спасти пользователя от неминуемой гибели: факториал ведь не определён для отрицательных чисел.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2012, 15:19     Факториал
Еще ссылки по теме:

C++ Факториал
факториал С++ C++
Факториал C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
14.08.2012, 15:19     Факториал #13
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Не знаю, что вы сделали, но у меня ваш вариант падает с сегфолтом при попытке вычислить fact(1) и fact(0). Наверное, потому что 1U – 2 = 4294967294 и стека не хватает.
- это из за UINT лучше с целым делать, да спасибо что показал, лучше так записать

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
#include <iostream>
using namespace std;
double fact(int val)
{
* * double res = val ? val : 1;
* * if(1 < (val -= 2))
* * * * res *= fact(val);
* * return res;
}
int main()
{
* * int value;
* * cout<<"Enter value : ";
* * if(!(cin>>value))
* * * * cout<<"Incorrect input\n";
* * else
* * * * cout<<fact(value)<<endl;
* * return 0;
}
http://liveworkspace.org/code/d54ca2...6842dc37e1dc58
Yandex
Объявления
14.08.2012, 15:19     Факториал
Ответ Создать тему
Опции темы

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