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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 51, средняя оценка - 4.88
!StUdEnT!
0 / 0 / 0
Регистрация: 14.05.2011
Сообщений: 6
21.05.2011, 13:39     факториал в с++ #1
Дано целое число 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++ Факториал
Факториал C++
C++ Факториал
C++ факториал
C++ факториал в С++
C++ С++ Факториал
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
21.05.2011, 13:58     факториал в с++ #2
Рекурсивная версия:
C++
1
2
3
4
5
6
7
8
__int64 factorial (int n)
{
 if (n==0)
 {
  return 1;
 }
 return factorial(n-1)*n;
}
, явно циклическая версия:
C++
1
2
3
4
5
6
7
8
9
__int64 factorial (int n)
{
 __int64 r;
 for (r=1; n!=0; --n)
 {
  r*=n;
 }
 return r;
}
. Рекурсивная версия есть наглядное пособие, как делать не надо, но работать будет и она, только тормознее и с перерасходом стека.
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
21.05.2011, 14:06     факториал в с++ #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Факториал можно вычислить на стадии компиляции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
template<int n>
class Factorial {
public:
    static const int f = Factorial<n - 1>::f * n;
};
 
template<>
class Factorial<0> {
public:        
    static const int f = 1;
};
 
int main() {
    std::cout << Factorial<5>::f << std::endl; // 120
}
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
21.05.2011, 14:11     факториал в с++ #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
 
int main()
{
    double sum = 2., fact = 1.;
    int N;
    std::cin >> N;
    for (int i = 2; i <= N; i++)
    {
        fact /= i;
        sum += fact;
    }
    std::cout << sum << std::endl;
    return 0;
}
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.05.2011, 16:53     факториал в с++ #5
Цитата Сообщение от gooseim Посмотреть сообщение
Факториал можно вычислить на стадии компиляции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
template<int n>
class Factorial {
public:
    static const int f = Factorial<n - 1>::f * n;
};
 
template<>
class Factorial<0> {
public:        
    static const int f = 1;
};
 
int main() {
    std::cout << Factorial<5>::f << std::endl; // 120
}
хм...интересно было бы посмотреть на вычисление какой нибудь функции или решение ДУ таким методом)
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.05.2011, 05:44     факториал в с++ #6
Цитата Сообщение от gooseim Посмотреть сообщение
Факториал можно вычислить на стадии компиляции
А если я напишу
C++
1
std::cout<<Factorial<999><<endl;
, то на стадии компиляции будет вычислена, а потом где то храниться вся тысяча факториалов?
gooseim
Эксперт С++
508 / 412 / 37
Регистрация: 23.09.2010
Сообщений: 1,159
23.05.2011, 10:33     факториал в с++ #7
taras atavin, будет храниться только один факториал, который (999!) .
diagon
Higher
 Аватар для diagon
1921 / 1187 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2011, 10:39     факториал в с++ #8
Т.е. никого не смущает, что
999!
402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
не влезет в int?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.06.2011, 16:30     факториал в с++ #9
Цитата Сообщение от gooseim Посмотреть сообщение
будет храниться только один факториал, который (999!) .
Нет. Все тысяча будут "храниться где-то", но только на этапе компиляции. (Если не учитывать невозможность его подсчёта)
Nesnakomez
0 / 0 / 0
Регистрация: 11.07.2009
Сообщений: 21
14.08.2011, 00:43     факториал в с++ #10
подскажите, в чем проблема: вычисляю факториал с использованием рекурсии. Результат выдает верный до определенного момента. Если ввести число для вычисления факториала начиная с 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"
using namespace std;
int factorial(int);
int num=1;
 
void 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;
}
ValeryLaptev
Эксперт С++
1012 / 791 / 46
Регистрация: 30.04.2011
Сообщений: 1,600
14.08.2011, 00:47     факториал в с++ #11
Nesnakomez, результат просто не помещается в int.
Надо возвращать double
Nesnakomez
0 / 0 / 0
Регистрация: 11.07.2009
Сообщений: 21
14.08.2011, 00:51     факториал в с++ #12
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Nesnakomez, результат просто не помещается в int.
Надо возвращать double
Пробовал, не помогает
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 00:51     факториал в с++ #13
ValeryLaptev, зачем вещественный тип применять для факториала? Есть же long long.
ValeryLaptev
Эксперт С++
1012 / 791 / 46
Регистрация: 30.04.2011
Сообщений: 1,600
14.08.2011, 00:53     факториал в с++ #14
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
ValeryLaptev, зачем вещественный тип применять для факториала? Есть же long long.
Этого все равно не хватает.
Вы знаете, какой максимальный x! приводит к переполнению на 32-битном Intel?
Всего 1755! - и мы вылетаем даже при наличии long double.
Nesnakomez
0 / 0 / 0
Регистрация: 11.07.2009
Сообщений: 21
14.08.2011, 00:53     факториал в с++ #15
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Есть же long long.
То же самое
у меня всего то 13!
дальше результаты то в плюс то в минус идут, еще и отрицательные результаты есть
ValeryLaptev
Эксперт С++
1012 / 791 / 46
Регистрация: 30.04.2011
Сообщений: 1,600
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++
 Аватар для CyBOSSeR
2295 / 1665 / 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++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 01:29     факториал в с++ #19
Nesnakomez, 13! = 6227020800, это больше чем влезет в знаковый 32 разрядный int, пробуйте long long.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2011, 02:06     факториал в с++
Еще ссылки по теме:

C++ Факториал Си
C++ Факториал
факториал С++ C++
Факториал C++
Описать рекурсивные функции вещественного типа, вычисляющие факториал и двойной факториал заданного числа C++

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

Или воспользуйтесь поиском по форуму:
greshnikk
 Аватар для 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 является точностью, с которой необходимо вычислить нашу функцию.
Как Вы можете заметить, в приведенной реализации не используется факториал, что значительно улучшает работу программы.
Yandex
Объявления
14.08.2011, 02:06     факториал в с++
Ответ Создать тему
Опции темы

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