Проблемы с факториалом
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Помогите новичку пожалуйста. В задании нужно найти сумму ряда, вроде все правильно только незнаю как задать, что бы вычислял факториал.
#include <iostream> #include <clocale> #include <math.h> using namespace std; int main() { setlocale(LC_CTYPE, "Russian"); double x; int n, Y, i, N, e; long double fact(int N); cout << "Введите x"; cin >> x; cout << "\n e="; cin >> e; n=N=2; while ((sin(x+n/fact(N+1))>e) { for (i=1;N;i++) { N*=i; } Y=sin(x+n)/fact(N+1); n=n+1; } cout << "Сумма ряда=" << Y << endl; }
Вычисление факториала на C++ — http://code-live.ru/post/cpp-recursive-factorial-calculating/.
Эт я знаю, а вот как вставить сюда?
Просто определите функцию
fact
в коде. У вас переменнаяe
, скорее всего, должна быть вещественной. Если это «эпсилон», задающий точность вычислений.#include <iostream> #include <clocale> #include <cmath> using namespace std; long double fact(int N) { if(N < 0) // если пользователь ввел отрицательное число return 0; // возвращаем ноль if (N == 0) // если пользователь ввел ноль, return 1; // возвращаем факториал от нуля - не удивляетесь, но это 1 =) else // Во всех остальных случаях return N * fact(N - 1); // делаем рекурсию. } int main() { setlocale(LC_CTYPE, "Russian"); double x; int n, Y, i, N, e; cout << "Введите x"; cin >> x; cout << "\n e="; cin >> e; n=N=2; while ((sin(x+n/fact(N+1))>e)) { for (i=1;N;i++) { N*=i; } Y=sin(x+n)/fact(N+1); n=n+1; } cout << "Сумма ряда=" << Y << endl; }
legron3000, «незнаю» пишется раздельно. Это во-первых. Во-вторых, в коде ниже показано как вставить функцию факториала в программу. Кстати, я использовал итерационный алгоритм — он быстрее и дешевле, чем рекурсивный. В-третьих, я попытался немножко привести в порядок твой код. При этом обнаружил несколько ошибок: (1) выражение для вычисления члена ряда написано по-разному; (2) переменная N в цикле не изменяется, всегда равна 2 — видимо ошибка; (3) переменная Y не накапливает сумму ряда, а всегда содержит последний вычисленный член ряда; (4) типы переменных определены не правильно: например Y, типа int, ни как не может корректно содержать значение функции синус.
#include <iostream> #include <cstdlib> #include <math.h> using namespace std; long double fact(int arg) { long double fct = 1; for (int i = 1; i <= arg; i++) fct *= i; return fct; } double f(double arg_x, int arg_n) { return sin(arg_x + arg_n) / fact(arg_n + 1); } int main() { setlocale(LC_CTYPE, "Russian"); double x, e; cout << "Введите x: "; cin >> x; cout << "\n e = "; cin >> e; int n; double Y = 0.0; double member; n = 2; while (fabs(member = f(x, n)) > e) { Y += member; n++; } cout << "Сумма ряда = " << Y << endl; system("pause"); return 0; }
Я вынес вычисление n-ного члена ряда в отдельную функцию, дабы код не дублировался. Проверь, правильно ли я угадал формулу )) Убрал повторное вычисление очередного члена ряда из цикла. Ну и ещё кое-чего по мелочи.
тоже как вариант но я потом сделал по другому:
Не будет оно у тебя правильно работать.
(1). Это — разные выражения:
while (sin(x+n/fact)>e) { Y=sin(x+n)/fact;
(2). В Y сумма ряда накапливаться не будет.
(3) Значение выражения sin(x+n/n!) будет стремиться к sin(x), т.е. к некой константе (x не изменяется). Скорее всего условие в while не будет работать как должно.
(4) Переменная e — целая. Если «е» символизирует «эпсилон», т.е. некий предел точности вычислений, то маловероятно, что тебя устроят значения 0, 1 или -1, учитывая, что область значений синуса [-1, 1].
(5) За неумение написать простейшую функцию (факториал) — на пересдачу однозначно.
(6) За неумение/нежелание разобраться в чужом решении — 1 год психотерапии в рядах Советской Армии.