Проблемы с факториалом

Проблемы с факториалом

Помогите новичку пожалуйста. В задании нужно найти сумму ряда, вроде все правильно только незнаю как задать, что бы вычислял факториал.

#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;
}

Просто определите функцию 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-ного члена ряда в отдельную функцию, дабы код не дублировался. Проверь, правильно ли я угадал формулу )) Убрал повторное вычисление очередного члена ряда из цикла. Ну и ещё кое-чего по мелочи.

тоже как вариант но я потом сделал по другому:

#include <iostream>
#include <clocale>
#include <math.h>
using namespace std;
int main()
{
setlocale(LC_CTYPE, «Russian»);
double x,Y=0,fact;
int n, i, e;
cout « «Введите x»;
cin » x;
cout « «\n e=»;
cin » e;
n=2;
fact=0;
for(i=1;i<n+1;i++)
{
fact+=facti;
}
while (sin(x+n/fact)>e)
{
Y=sin(x+n)/fact;
n=n+1;
for(i=1;i<n+1;i++)
{
fact
=i;
}
}
cout « «Сумма ряда=» « Y « endl;
}

Не будет оно у тебя правильно работать.

(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 год психотерапии в рядах Советской Армии.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.