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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Sithis
10 / 1 / 0
Регистрация: 27.11.2011
Сообщений: 98
#1

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

14.08.2012, 11:59. Просмотров 1095. Ответов 12
Метки нет (Все метки)

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

Описать рекурсивные функции вещественного типа, вычисляющие факториал и двойной факториал заданного числа - C++
Описать рекурсивные функции Fact(N) и Fact2(N) вещественного типа, вычисляющие значения факториала N! и двойного факториала N!!...

Факториал - C++
Как написать программу для вычисления n факториал

Факториал - C++
Пользователь вводит число и программа считает его факториал. Например 5! = 5*4*3*2*1 = 120. кто не помнит факториал считает так:...

С++ Факториал - C++
Надо написать программку на С++ которая вычисляет факториал числа n (факториал обозначается как n!). числа n в диапазоне от 1 до 12...

факториал - C++
Я только начал изучать С++ и вот столкнулся с проблемой: дано положительное число A>=10.Найти такое число k, что (k-1)!<=A<=k! ...

Факториал Си - C++
Здравствуйте. Нужно решить следующую задачку. Заранее огромное спасибо.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 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);
}
1
-=ЮрА=-
Заблокирован
Автор FAQ
14.08.2012, 13:21 #3
Sithis, будьте внимательны с кодом
~OhMyGodSoLong~, т.к. результат его код выдаёт неверный, сравни ответ для ffact(5) (он составит 15) http://liveworkspace.org/code/9611d8...44b540ea7ccc28
со скриншотом проверки работы алгоритма в MathCAD


Не по теме:

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

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

Не по теме:

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

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

Не по теме:

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

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

Не по теме:

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

1
Thinker
Эксперт C++
4226 / 2200 / 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 />
1
-=ЮрА=-
14.08.2012, 13:43
  #9

Не по теме:

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

1
rinat_w
89 / 85 / 4
Регистрация: 13.11.2011
Сообщений: 192
Завершенные тесты: 1
14.08.2012, 13:59 #10
-=ЮрА=-, если хочешь взять факториал два раза то пишется вот так : (5!)! очень большое число, а если двойной факториал то : 5!! = 5*3*1 как-то так, а mathcad вычисляет (5!)!
1
-=ЮрА=-
Заблокирован
Автор 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-м посте)
1
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
14.08.2012, 15:08 #12

Не по теме:

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


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

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

Факториал - C++
Дано натуральное число n; найти n!. Использовать программу, включающую рекурсивную процедуру вычисления n!

Факториал - C++
Имеется код: #include &lt;iostream&gt; using namespace std; long long fact(int a); int main() { long long int N;

факториал С++ - C++
Ребята, помогите пожалуйста с факториалом, а то я все не могу понять как сделать так что-бы k1 - факториал, от k до n #include...

Факториал - C++
Здравствуйте Всем!!! Меня зовут Наталья. Помогите решить задание на С++: Дано натуральное число n; найти n!. Использовать программу,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.08.2012, 15:19
Ответ Создать тему
Опции темы

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