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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.64
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
22.09.2010, 18:15     Факториал #1
Помогите написать программу:
Составить функцию, которая вычисляет сумму К слагаемых. В вызывающей функции main() организовать контроль ввода положительного целого K, большего 0. Через do... while или while или for
--------------
В знаменателе 2n-1, а что делать со степенью x и меняющимися знаками??
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2010, 18:15     Факториал
Посмотрите здесь:

C++ факториал
C++ Факториал (n-1)!
факториал в с++ C++
C++ Факториал
C++ Факториал Си
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.09.2010, 18:23     Факториал #2
А что с ней делать? вычислят! pow(x, n);
С меняющимися знаками так
pow(-1.0, i), где i начинается с 0 и каждую итерацию увеличивается.
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
22.09.2010, 18:44  [ТС]     Факториал #3
Да я понял, что вычислять, но там же не по порядку меняются степени. Как это организовать? pow(x,n) это и так понятно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.09.2010, 18:47     Факториал #4
А вы приглядитесь.
0-я + 1-я
минус
4-я + 5-я
плюс
8-я + 9-я
минус
12-я + 13-я
....
Закономерность уловили?
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
22.09.2010, 21:20  [ТС]     Факториал #5
если честно, то нет, понял что на n+4 отличаются а как дальше не знаю ...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
22.09.2010, 21:47     Факториал #6
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int factorial(int);
double calculate(double, int);
 
int main()
{
    double K;
    double x;
    double result;
 
    do
    {
        printf("Input K: ");
        scanf("%lf", &K);
 
        if (K <= 0.0)
            printf("K must be greater than or equal to zero! Try...\n\n");
    }
    while (K <= 0.0);
 
    printf("Input x: ");
    scanf("%lf", &x);
 
    result = calculate(x, K);
 
    printf("Result of calculating: %lf", result);
 
    getch();
    return 0;
}
 
int factorial(int n)
{
    int i;
 
    for (i = n - 1; i > 1; i--)
        n *= i;
 
    return (n == 0) ? 1 : n;
}
 
double calculate(double x, int K)
{
    double sum = 0.0;
    int p, n;
    int i;
 
    for (i = -1, n = 0, p = 0; n < K; n++)
    {
        sum += pow(-1.0, p) * pow(x, ++i) / factorial(2 * n + 1);
 
        if (i % 2 != 0)
        {
            i += 2;
            p++;
        }
    }
 
    return sum;
}
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
22.09.2010, 23:08     Факториал #7
silent_1991, решение решением, но нехорошее, при n чуть больше десяти факториал начнет давать отрицательные значения
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
23.09.2010, 12:42     Факториал #8
Разумеется, целью не было написать продукт, который хоть сейчас можно продавать, а показать принцип, ведь я уверен, у ТСа ещё куча подобных заданий будет.

Добавлено через 5 минут
Можно так.

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
double factorial(double);
double calculate(double, int);
 
int main()
{
    double K;
    double x;
    double result;
 
    do
    {
        printf("Input K: ");
        scanf("%lf", &K);
 
        if (K <= 0.0)
            printf("K must be greater than or equal to zero! Try...\n\n");
    }
    while (K <= 0.0);
 
    printf("Input x: ");
    scanf("%lf", &x);
 
    result = calculate(x, (double)K);
 
    printf("Result of calculating: %lf", result);
 
    getch();
    return 0;
}
 
double factorial(double n)
{
    double i;
 
    for (i = n - 1.0; i > 1.0; i -= 1.0)
        n *= i;
 
    return (n == 0.0) ? 1.0 : n;
}
 
double calculate(double x, int K)
{
    double sum = 0.0;
    int p;
    double n;
    int i;
 
    for (i = -1, n = 0.0, p = 0; n < K; n += 1.0)
    {
        sum += pow(-1.0, p) * pow(x, ++i) / factorial(2.0 * n + 1.0);
 
        if (i % 2 != 0)
        {
            i += 2;
            p++;
        }
    }
 
    return sum;
}
Добавлено через 1 минуту
Только K всё же надо было оставить int...
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
29.09.2010, 16:39  [ТС]     Факториал #9
На днях защищал лабу, и препод по этой проге сказал, что надо было её написать при помощи какой-то рекурсии. Говорит что с ней легче решить и не надо две функции писать поэтому...
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
29.09.2010, 16:42     Факториал #10
Ну и зря он так сказал... Факториал лучше писать циклом, а не рекурсией.
Syndarin
13 / 13 / 1
Регистрация: 15.09.2009
Сообщений: 57
29.09.2010, 16:47     Факториал #11
Рекурсивно

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <conio.h>
 
int FactorialFunc(int n)
{
    if(n==1)
        return 1;
    else
        return n*FactorialFunc(n-1);
}
 
void main()
{
    int n;
    int result;
    printf("Enter your n: \n");
    scanf("%d", &n);
    result=FactorialFunc(n);
    printf("Factorial of %d is %d\n", n, result);
    getch();
}
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
29.09.2010, 16:48  [ТС]     Факториал #12
Не могли бы объяснить как при помощи рекуррентности сделать. Функция main одна для всех этих программ
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
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
 
double factorial(double);
double calculate(double, int);
 
int main()
{
    double K;
    double x;
    double result;
 
    do
    {
        cout << "Input K: ";
        cin >> K;
 
        if (K <= 0.0)
            cout << "K must be greater than or equal to zero! Try...\n\n";
    }
    while (K <= 0.0);
 
    cout << "Input x: ";
    cin >> x;
 
    result = calculate(x, (double)K);
 
    cout << "Result: " << result;
 
 
    getch();
    return 0;
}
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
27
28
29
30
31
32
33
34
35
#include <math.h>
double factorial(double);
double calculate(double, int);
 
double factorial(double n)
{
    double i;
    
 
    for (i = n - 1.0; i > 1.0; i -= 1.0)
        n *= i;
 
    return (n == 0.0) ? 1.0 : n;
}
 
double calculate(double x, int K)
{
    double sum = 0.0;
    int p;
    double n;
    int i;
 
    for (i = -1, n = 0.0, p = 0; n < K; n += 1.0)
    {
        sum += pow(-1.0, p) * pow(x, ++i) / factorial(2.0 * n + 1.0);
 
        if (i % 2 != 0)
        {
            i += 2;
            p++;
        }
    }
 
    return sum;
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <math.h>
double factorial(double);
double calculate(double, int);
 
double factorial(double n)
{
double i;
 
i = n - 1.0;
 
while (i > 1.0)
{
n *= i;
i -= 1.0;
}
 
return (n == 0.0) ? 1.0 : n;
}
 
double calculate(double x, int K)
{
    double sum = 0.0;
    int p = 0;
    double n = 0.0;
    int i = -1;
 
    while (n < K)
    {
sum += pow(-1.0, p) * pow(x, ++i) / factorial(2.0 * n + 1.0);
 
        if (i % 2 != 0)
        {
            i += 2;
            p++;
        }
 
n += 1.0;
    }
 
    return sum;
}
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <math.h>
double factorial(double);
double calculate(double, int);
 
double factorial(double n)
{
double i;
 
i = n - 1.0;
 
do
{
n *= i;
i -= 1.0;
}
while (i > 1.0);
 
return (n == 0.0) ? 1.0 : n;
}
 
double calculate(double x, int K)
{
    double sum = 0.0;
    int p = 0;
    double n = 0.0;
    int i = -1;
 
    do
    {
sum += pow(-1.0, p) * pow(x, ++i) / factorial(2.0 * n + 1.0);
 
        if (i % 2 != 0)
        {
            i += 2;
            p++;
        }
 
n += 1.0;
    }
    while (n < K);
 
    return sum;
}
Syndarin
13 / 13 / 1
Регистрация: 15.09.2009
Сообщений: 57
29.09.2010, 16:50     Факториал #13
Что-то я совсем плохой стал... совсем задание не читаю
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
29.09.2010, 17:12  [ТС]     Факториал #14
Рекурсией решается только факториал или вся программа?
Syndarin
13 / 13 / 1
Регистрация: 15.09.2009
Сообщений: 57
29.09.2010, 17:14     Факториал #15
Только нахождение факториала, я ж грю - условие как-то нехорошо прочитал
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
29.09.2010, 17:25  [ТС]     Факториал #16
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
27
28
29
30
31
32
33
#include <math.h>
double factorial(double);
double calculate(double, int);
 
double factorial(double n)
{
    if(n==1)
                return 1;
        else
                return n*factorial(n-1);
 
}
 
double calculate(double x, int K)
{
    double sum = 0.0;
    int p;
    double n;
    int i;
 
    for (i = -1, n = 0.0, p = 0; n < K; n += 1.0)
    {
        sum += pow(-1.0, p) * pow(x, ++i) / factorial(2.0 * n + 1.0);
 
        if (i % 2 != 0)
        {
            i += 2;
            p++;
        }
    }
 
    return sum;
}
В моём случает так?
Syndarin
13 / 13 / 1
Регистрация: 15.09.2009
Сообщений: 57
29.09.2010, 17:27     Факториал #17
В функцию calculate не вникал, но похоже на то
MarchZM
0 / 0 / 0
Регистрация: 18.09.2010
Сообщений: 52
30.09.2010, 21:23  [ТС]     Факториал #18
Спасибо всем!

Добавлено через 19 часов 46 минут
а саму функцию calculate через рекуррентность никак нельзя?

Добавлено через 8 часов 8 минут
Пожалуйста помогите с рекуррентностью, мне нужно избавиться от факториала
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
30.09.2010, 22:12     Факториал #19
MarchZM,
Вообще-то честно говоря не могу сообразить, какая тут будет рекурсивная функция...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2010, 22:38     Факториал
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
30.09.2010, 22:38     Факториал #20
MarchZM, ваш преподавателю наверное не понравилось что факториал и возведение в степень считаются каждый раз заново для каждого члена. А по-хорошему надо бы новый член считать из предыдущего, не делая повторных вычислений.
a[0]=1
a[1]=x

b[0]=1;

a[i]=-a[i-2]*x^4;
b[i]=b[i-1]*(2*i-1)*(2*i-2)

S=a[i]/b[i]

вродь формулы такие, хотя могу ошибаться.

Не по теме:

silent_1991, извиняюся за упорство, насчет ряда Тейлора я был не прав.

Yandex
Объявления
30.09.2010, 22:38     Факториал
Ответ Создать тему
Опции темы

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