Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/50: Рейтинг темы: голосов - 50, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 14.05.2011
Сообщений: 6

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

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

Студворк — интернет-сервис помощи студентам
Дано целое число N (>0). Вывести сумму 2 + 1/(2!) +1/(3!)+ ... + 1/(N!) Полученное число является приближеным значением константы е=ехр(1)(=2.71828183).
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2011, 13:39
Ответы с готовыми решениями:

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

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

факториал
Задача: написать 3 функции, считающие факториал неотрицательного целого числа от 0 до 170 3 способами: - с помощью цикла - рекурсивно...

34
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
21.05.2011, 13:58
Рекурсивная версия:
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;
}
. Рекурсивная версия есть наглядное пособие, как делать не надо, но работать будет и она, только тормознее и с перерасходом стека.
1
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
21.05.2011, 14:06
Лучший ответ Сообщение было отмечено как решение

Решение

Факториал можно вычислить на стадии компиляции
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
}
6
 Аватар для kazak
3601 / 2742 / 355
Регистрация: 11.03.2009
Сообщений: 6,300
21.05.2011, 14:11
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;
}
2
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
21.05.2011, 16:53
Цитата Сообщение от 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
}
хм...интересно было бы посмотреть на вычисление какой нибудь функции или решение ДУ таким методом)
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.05.2011, 05:44
Цитата Сообщение от gooseim Посмотреть сообщение
Факториал можно вычислить на стадии компиляции
А если я напишу
C++
1
std::cout<<Factorial<999><<endl;
, то на стадии компиляции будет вычислена, а потом где то храниться вся тысяча факториалов?
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
23.05.2011, 10:33
taras atavin, будет храниться только один факториал, который (999!) .
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
23.05.2011, 10:39
Т.е. никого не смущает, что
999!
4023872600770937735437024339230039857193 7486421071463254379991042993851239862902 0592044208486969404800479988610197196058 6316668729948085589013238296699445909974 2450408707375991882362772718873251977950 5950995276120874975462497043601418278094 6464962910563938874378864873371191810458 2578364784997701247663288983595573543251 3185323958463075557409114262417474349347 5534286465766116677973966688202912073791 4385371958824980812686783837455973174613 6085379534524221586593201928090878297308 4313928444032812315586110369768013573042 1616874760967587134831202547858932076716 9132448426236131412508780208000261683151 0273418279777047846358681701643650241536 9139828126481021309276124489635992870511 4964975419909342221566832572080821333186 1168115536158365469840467089756029009505 3761647584772842188967964624494516076535 3408198901385442487984959953319101723355 5566021394503997362807501378376153071277 6192684903435262520001588853514733161170 2103968175921510907788019393178114194545 2572238655414610628921879602238389714760 8850627686296714667469756291123408243920 8160153780889893964518263243671616762179 1689097799119037540312746222899880051954 4441428201218736174599264295658174662830 2955570299024324153181617210465832036786 9061172601587835207515162842255402651704 8330422614397428693306169089796848259012 5458327168226458066526769958652682272807 0757813918581788896522081643483448259932 6604336766017699961283186078838615027946 5955131156552036093988180612138558600301 4356945272242063446317974605946825731037 9008402443243846565724501440282188525247 0935190620929023136493273497565513958720 5596542287497740114133469627154228458623 7738753823048386568897646192738381490014 0767310446640259899490222221765904339901 8860185665264850617997023561938970178600 4081188972991831102117122984590164192106 8884387121855646124960798722908519296819 3723886426148396573822911231250241866493 5314397013742853192664987533721894069428 1434118520158014123344828015051399694290 1534830776445690990731524332782882698646 0278986432113908350621709500259738986355 4277196742822248757586765752344220207573 6305694988250879689281627538488633969099 5982628095612145099487170124451646126037 9029309120889086942028510640182154399457 1568059418727489980942547421735824010636 7740459574178516082923013535808184009699 6372524230560855903700624271243416909004 1536901059339838357779394109700277534720 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 00000
не влезет в int?
1
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
18.06.2011, 16:30
Цитата Сообщение от gooseim Посмотреть сообщение
будет храниться только один факториал, который (999!) .
Нет. Все тысяча будут "храниться где-то", но только на этапе компиляции. (Если не учитывать невозможность его подсчёта)
1
0 / 0 / 0
Регистрация: 11.07.2009
Сообщений: 21
14.08.2011, 00:43
подскажите, в чем проблема: вычисляю факториал с использованием рекурсии. Результат выдает верный до определенного момента. Если ввести число для вычисления факториала начиная с 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;
}
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
14.08.2011, 00:47
Nesnakomez, результат просто не помещается в int.
Надо возвращать double
0
0 / 0 / 0
Регистрация: 11.07.2009
Сообщений: 21
14.08.2011, 00:51
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Nesnakomez, результат просто не помещается в int.
Надо возвращать double
Пробовал, не помогает
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 00:51
ValeryLaptev, зачем вещественный тип применять для факториала? Есть же long long.
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
14.08.2011, 00:53
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
ValeryLaptev, зачем вещественный тип применять для факториала? Есть же long long.
Этого все равно не хватает.
Вы знаете, какой максимальный x! приводит к переполнению на 32-битном Intel?
Всего 1755! - и мы вылетаем даже при наличии long double.
0
0 / 0 / 0
Регистрация: 11.07.2009
Сообщений: 21
14.08.2011, 00:53
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Есть же long long.
То же самое
у меня всего то 13!
дальше результаты то в плюс то в минус идут, еще и отрицательные результаты есть
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
14.08.2011, 00:58
Цитата Сообщение от 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;
}
1
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 01:03
Nesnakomez, для начала напишите функцию по-человечески:
C++
1
2
3
int factorial(int number) {
  return number == 0? 1 : number * factorial(number - 1);
}
и сравните результаты.
1
0 / 0 / 0
Регистрация: 11.07.2009
Сообщений: 21
14.08.2011, 01:22
На счет ужаса я на спорю, я же начинающий, всего-то неделю.
Глобальная переменная: а чем она именно в этом коде мешает?
библиотеки я записывал в угловых скобках, VS проставляет в кавычках. Работает и так и так.
Изменил как в первом варианте, все равно так же само работает. До 12 включительно правильно считает, с 13 уменьшается результат. Пока не заменил на double возвращаемый тип
По второму варианту не смог изменить,выдает ошибку(не распознанная лексема), подозреваю это по "?" А сам я не могу понять что это означает, я все-таки зеленый еще....
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 01:29
Nesnakomez, 13! = 6227020800, это больше чем влезет в знаковый 32 разрядный int, пробуйте long long.
1
 Аватар для greshnikk
31 / 31 / 8
Регистрация: 05.11.2008
Сообщений: 162
14.08.2011, 02:06
Откровенно говоря, я не совсем понял, зачем здесь вычислять факториал. Как Вы уже поняли это очень "не красивый" подход. Я предлагаю альтернативное решение:
Мы знаем, что каждый следующий элемент в последовательности является предыдущему, разделенному на (порядковый номер элемента + 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 является точностью, с которой необходимо вычислить нашу функцию.
Как Вы можете заметить, в приведенной реализации не используется факториал, что значительно улучшает работу программы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.08.2011, 02:06
Помогаю со студенческими работами здесь

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

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

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

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

Факториал
Элементарный код для того чтобы узнать ФАКТОРИАЛ числа.:D #include &lt;iostream&gt; using namespace std; long long Factorial (int N) { ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru