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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 51, средняя оценка - 4.88
!StUdEnT!
0 / 0 / 0
Регистрация: 14.05.2011
Сообщений: 6
#1

факториал в с++ - C++

21.05.2011, 13:39. Просмотров 6500. Ответов 34
Метки нет (Все метки)

Дано целое число N (>0). Вывести сумму 2 + 1/(2!) +1/(3!)+ ... + 1/(N!) Полученное число является приближеным значением константы е=ехр(1)(=2.71828183).
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2011, 13:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос факториал в с++ (C++):

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

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

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

Факториал с++ - C++
1. Ввести n элементов одномерного массива; 2. Вычислить указанное выражение; 3. Вывести на экран значение указанного выражения.

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

Факториал - C++
Помогите написать программу: Составить функцию, которая вычисляет сумму К слагаемых. В вызывающей функции main() организовать контроль...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
14.08.2011, 00:58 #16
Цитата Сообщение от Nesnakomez Посмотреть сообщение
подскажите, в чем проблема: вычисляю факториал с использованием рекурсии. Результат выдает верный до определенного момента. Если ввести число для вычисления факториала начиная с 13, результат начинает уменьшаться...
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "iostream"  -- неправильно -- надо <iostream>
using namespace std;
int factorial(int);
int num=1;                    -- глобальная переменная -- 
 
void main()                   -- int main() --
{
    int n;
    cout<< "Input a number" << endl;
    cin>> n;
    factorial(n);          -- выводить результат должна вызывающая функция --
}
 
// -- это - УЖОС -- извините... :)
int factorial(int n)
{
    if(n>=1)
    {
    num*=n;
    n--;
    factorial(n);
    }
    else
    cout<<num<<endl;    
    return num;
}
Надо так:
C++
1
2
3
double factorial(double n)
{ if (n > 1.0) return n*factorial(n-1); else return 1.0;
}
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 01:03 #17
Nesnakomez, для начала напишите функцию по-человечески:
C++
1
2
3
int factorial(int number) {
  return number == 0? 1 : number * factorial(number - 1);
}
и сравните результаты.
Nesnakomez
0 / 0 / 0
Регистрация: 11.07.2009
Сообщений: 21
14.08.2011, 01:22 #18
На счет ужаса я на спорю, я же начинающий, всего-то неделю.
Глобальная переменная: а чем она именно в этом коде мешает?
библиотеки я записывал в угловых скобках, VS проставляет в кавычках. Работает и так и так.
Изменил как в первом варианте, все равно так же само работает. До 12 включительно правильно считает, с 13 уменьшается результат. Пока не заменил на double возвращаемый тип
По второму варианту не смог изменить,выдает ошибку(не распознанная лексема), подозреваю это по "?" А сам я не могу понять что это означает, я все-таки зеленый еще....
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 01:29 #19
Nesnakomez, 13! = 6227020800, это больше чем влезет в знаковый 32 разрядный int, пробуйте long long.
greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
14.08.2011, 02:06 #20
Откровенно говоря, я не совсем понял, зачем здесь вычислять факториал. Как Вы уже поняли это очень "не красивый" подход. Я предлагаю альтернативное решение:
Мы знаем, что каждый следующий элемент в последовательности является предыдущему, разделенному на (порядковый номер элемента + 1). Ну так используем эту возможность.
1 элемент = 1 \ 2;
2 элемент = (1 \ 2) \ 3;
3 элемент = 2 элемент \ 4;
...
N элемент = N - 1 элемент \ N + 1;

Для наглядности приведу весь код (VS 2005):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
const double ACCURACY = 0.00001;
 
int main (void)
{
    double nextElement = 1;
    double factorial = 2;
    for (int i = 2; nextElement > ACCURACY; ++i)
    {
        nextElement /= i;
        factorial += nextElement;
    }
    return 0;
}
,где ACCURACY является точностью, с которой необходимо вычислить нашу функцию.
Как Вы можете заметить, в приведенной реализации не используется факториал, что значительно улучшает работу программы.
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
14.08.2011, 02:22 #21
Цитата Сообщение от Nesnakomez Посмотреть сообщение
\подозреваю это по "?" А сам я не могу понять что это означает, я все-таки зеленый еще....
?: - это тернарный оператор.
логическое выражение ? выражение 1 : выражение 2
Алгоритм работы операции следующий:
1.Вычисляется логическое выражение.
2.Если логическое выражение истинно, то вычисляется выражение 1, иначе — выражение 2.
3.Вычисленное значение возвращается.
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
14.08.2011, 08:52 #22
рекурсии вычислять факториал
Длинная арифметика. сумма факториалов.
Чтобы получить exp, можно найти субфакториал и поделить на него факториал.
Могу на яве код привести... На с++ деление длинных дробей не пробовал реализовывать =(
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
14.08.2011, 10:07 #23
Цитата Сообщение от diagon Посмотреть сообщение
Т.е. никого не смущает, что 999! не влезет в int?
А мало ли какой они длины? Может какой уникум сделал дефалт их разрядности на много больше килобайта?

Добавлено через 1 минуту
Цитата Сообщение от Nesnakomez Посмотреть сообщение
подскажите, в чем проблема: вычисляю факториал с использованием рекурсии. Результат выдает верный до определенного момента. Если ввести число для вычисления факториала начиная с 13, результат начинает уменьшаться...
Этот глюк зовётся переполнением типа.

Добавлено через 6 минут
Цитата Сообщение от Nesnakomez Посмотреть сообщение
Глобальная переменная: а чем она именно в этом коде мешает?
Она начнёт мешать ровно в тот момент, когда ты, забыв про неё, попытаешься для других целей объявить ещё что нибудь глобальное с тем же именем, найдёшь и уберёшь дублирование декларации, а само использование одной и той же переменной для разных целей и не последовательно (что хоть как то напоминает норму), а вперемешку оставишь. Причём, можешь при этом ещё и тип поменять.

Добавлено через 1 минуту
Кстати почему ни кто не обратил внимание на то, что факториал здесь в знаменателе? Дробь же - явный флоат, а для больших N ещё и приближается к нулю.
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
14.08.2011, 10:22 #24
Цитата Сообщение от !StUdEnT! Посмотреть сообщение
Дано целое число N (>0). Вывести сумму 2 + 1/(2!) +1/(3!)+ ... + 1/(N!) Полученное число является приближеным значением константы е=ехр(1)(=2.71828183).
Это же формула тейлора для экспоненты.
Лови:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
long double taylor(long double x, long double eps)
{
 int i;
 long double rez=1.0, n=1.0;
 do
  {
   n*=x/i;
   rez+=n;   
   i++;
  }
 while (fabs(n)>=eps);
 return rez; 
}
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
14.08.2011, 13:01 #25
Так еще можно ехр получить...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
unsigned long long fact(unsigned n){
    unsigned long long res = 1;
    for (; n; res *= n--);
    return res;
}
unsigned long long subfact(int n){
    if (n <= 1)
        return 0;
    unsigned long long * arr = new unsigned long long [n + 1];
    arr[2] = 1;
    for (int i = 3; i <= n; ++i)
        arr[i] = arr[i-1] * i + ( i % 2 ? -1 : 1);
    unsigned long long res = arr[n];
    delete[] arr;
    return res;
}
int main(){
    int n = 15;
    std::cout <<  1. * fact(n) / subfact(n);    
}
greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
14.08.2011, 13:48 #26
To AvengerAlive: Мне кажется, что большинство, кто отвечают в тему, не читают предыдущих постов. Уже был предложен вариант с Тейлором и я написал это на 2 странице. Читайте пожалуйста все посты, перед тем, как что-либо ответить.
Мой ответ
To diagon: По поводу арифметики длинных чисел, она здесь просто не нужна. Если Вас попросят сложить N раз число M Вы что, так и будете, извините за выражение "в лоб" писать цикл от 0 до N, складывать M с собой, или же просто напишите на выходе N*M ? Здесь знание факториала абсолютно избыточно. Задача стояла найти число Эйлера, а не написать программу, которая выдает N!.
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
14.08.2011, 14:51 #27
Цитата Сообщение от greshnikk Посмотреть сообщение
Если Вас попросят сложить N раз число M Вы что, так и будете, извините за выражение "в лоб" писать цикл от 0 до N, складывать M с собой, или же просто напишите на выходе N*M
Смотря какие эти M и N. Если используется длинная арифметика, то либо алгоритм Шенхаге-Штрассена надо использовать или, на худой конец, алгоритм Карацубы-Офмана. Так что не все так просто
greshnikk
30 / 30 / 0
Регистрация: 05.11.2008
Сообщений: 162
14.08.2011, 18:53 #28
Цитата Сообщение от Olga_ Посмотреть сообщение
Смотря какие эти M и N. Если используется длинная арифметика, то либо алгоритм Шенхаге-Штрассена надо использовать или, на худой конец, алгоритм Карацубы-Офмана. Так что не все так просто
Уверяю Вас, это не имеет абсолютно никакого значения. Чем длинное число отличается от обычного ? С длинными числами, тоже нужно будет делать M*N, а не складывать M, N раз, только представление числа будет другое, логика останется той же.
Но мы отклонились от темы. Своим постом я хотел сказать то, что в данной задаче будет правильно не использовать факториал, по-скольку это плохой подход к задаче.
grizlik78
Эксперт С++
1908 / 1440 / 111
Регистрация: 29.05.2011
Сообщений: 2,996
14.08.2011, 19:10 #29
Цитата Сообщение от greshnikk Посмотреть сообщение
что в данной задаче будет правильно не использовать факториал, по-скольку это плохой подход к задаче.
Угу. Только ТС свою задачу уже давным давно решил, а Nesnakomez не говорил, что факториал ему нужен для такой же задачи.
Olga_
840 / 182 / 16
Регистрация: 01.08.2011
Сообщений: 502
14.08.2011, 19:41 #30
Цитата Сообщение от greshnikk Посмотреть сообщение
Уверяю Вас, это не имеет абсолютно никакого значения. Чем длинное число отличается от обычного ? С длинными числами, тоже нужно будет делать M*N, а не складывать M, N раз...
Если бы можно было так взять и перемножить очень длинные числа, которые хранятся не совсем как числа. Уж просто вы это все представляете себе А факториал, конечно, здесь не нужен, это и ребенку понятно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2011, 19:41
Привет! Вот еще темы с ответами:

факториал - C++
найти число нулей в конце факториала числа N по основанию каждого множителя K (1&lt;=N&lt;=1000000000, 2&lt;=K&lt;=1000) #include &lt;iostream&gt; ...

Факториал - C++
Пожалуйсто, помогите написать прогу на Си, которая вичисляла бы 100! (факториал) выводя всё на экран!

Факториал (n-1)! - C++
Помогите, пожалуйста, написать факториал (n-1)! очень надо

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


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

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

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