Консультация № 175381
17.12.2009, 14:31
0.00 руб.
0 6 2
Вычислить сумму бесконечного ряда: S=1+2/2!+3/3!+4/4!........
1. Для указанного количества членов ряда
2. С заданной точностью
(точность и количество членов ряда вводятся клавиатуры)


Приложение:
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
void main()
{
int i, j, a, n, a1;
float S;
S=1;
printf ("Vvedite kolichestvo chisel v posledovatel`nosti");
scanf ("%i", &n);
for (i=2; i<n; i++)
{
a=1;
for (j=2;j<n; j++)
a=a*j;
a1=i/a;
}
S=S+a1;
printf ("%g", S);
getch();
}

Обсуждение

давно
Профессор
230118
3054
17.12.2009, 14:49
общий
Никонова Анастасия Сергеевна:
Программа написана нерационально. Значение факториала можно использовать с предыдущей итерации, просто умножим на текущее i. Чтобы считать заданной точностью, введите с клавиатуры точность. В конце цикла сравнивайте значение с ней, если меньше, то выход из цикла.
давно
Специалист
246813
155
17.12.2009, 15:40
общий
Никонова Анастасия Сергеевна:
Какую версию используете для написания кода? 6.0 или более раннюю версию?
Неизвестный
17.12.2009, 18:16
общий
Никонова Анастасия Сергеевна:
Общий член ряда - n/n! = 1/(n-1)!
Если вычислен n-й член ряда, то следующий определяется так: an+1 = an/n

То есть цикл должен выглядеть так:
S = 1;
for (i = 1; i < N; i++) {
a /= i;
S += a;
}

В цикле именно меньше, т.к. первый элемент был учтен на присваивании S=1.
Неизвестный
17.12.2009, 20:26
общий
Никонова Анастасия Сергеевна:
Добрый вечер! В Вашем коде есть ряд ошибок: как определения типов, так и алгоритмические. Прежде всего, операция деления 1/a, где a- целое число, дает 0, за исключением a=1. Конечно, у Вас ряд вещественных членов. Не меняя Ваш подход, я внес исправления. Они окружены строчками комментариев.
Код:

/*#include "stdafx.h" */
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
int main()
/* Вычислить сумму бесконечного ряда: S=1+2/2!+3/3!+4/4!........
1. Для указанного количества членов ряда
*/

{
int i, j, n;
/*!!!!!!!!!!!!!!!!!*/
double a, a1, S;
/*!!!!!!!!!!!!!!!!!*/

S=1;

/******************/
a1=0;
/******************/

printf ("Vvedite kolichestvo chisel v posledovatel`nosti");
/*!!!!!!!!!!!!!!!!!*/
scanf ("%d", &n);
/*!!!!!!!!!!!!!!!!!*/
for (i=2; i<=n; i++)
{
a=1;
/*******************/
for (j=1;j<i; j++)
/********************/
a=a*j;
/*!!!!!!!!!!!!!!!!!*/
a1=1.0/a;
/*!!!!!!!!!!!!!!!!!*/

/*!!!!!!!!!!!!!!!!!*/
S=S+a1;
/*!!!!!!!!!!!!!!!!!*/
}
printf ("s=%f\n", S);
/* getch();*/
return 0;
}

Кроме того, GCC кое-где "ругается", /*#include "stdafx.h" */
давно
Старший Модератор
17042
808
21.12.2009, 06:38
общий
это ответ
Здравствуйте, Никонова Анастасия Сергеевна!
Ответ сформирован на основе сообщений из мини-форума вопроса.

Ashotn:

Программа написана нерационально. Значение факториала можно использовать с предыдущей итерации, просто умножим на текущее i. Чтобы считать заданной точностью, введите с клавиатуры точность. В конце цикла сравнивайте значение с ней, если меньше, то выход из цикла.

_Ayl_

Общий член ряда - n/n! = 1/(n-1)!
Если вычислен n-й член ряда, то следующий определяется так: an+1 = an/n

То есть цикл должен выглядеть так:
S = 1;
for (i = 1; i < N; i++) {
a /= i;
S += a;
}

В цикле именно меньше, т.к. первый элемент был учтен на присваивании S=1.

lamed:

В Вашем коде есть ряд ошибок: как определения типов, так и алгоритмические. Прежде всего, операция деления 1/a, где a- целое число, дает 0, за исключением a=1. Конечно, у Вас ряд вещественных членов. Не меняя Ваш подход, я внес исправления. Они окружены строчками комментариев.

Код lamed в приложении.

Приложение:
/*#include "stdafx.h" */
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
int main()
/* Вычислить сумму бесконечного ряда: S=1+2/2!+3/3!+4/4!........
1. Для указанного количества членов ряда
*/

{
int i, j, n;
/*!!!!!!!!!!!!!!!!!*/
double a, a1, S;
/*!!!!!!!!!!!!!!!!!*/

S=1;

/******************/
a1=0;
/******************/

printf ("Vvedite kolichestvo chisel v posledovatel`nosti");
/*!!!!!!!!!!!!!!!!!*/
scanf ("%d", &n);
/*!!!!!!!!!!!!!!!!!*/
for (i=2; i<=n; i++)
{
a=1;
/*******************/
for (j=1;j<i; j++)
/********************/
a=a*j;
/*!!!!!!!!!!!!!!!!!*/
a1=1.0/a;
/*!!!!!!!!!!!!!!!!!*/

/*!!!!!!!!!!!!!!!!!*/
S=S+a1;
/*!!!!!!!!!!!!!!!!!*/
}
printf ("s=%f\n", S);
/* getch();*/
return 0;
}
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
давно
Профессор
230118
3054
21.12.2009, 11:52
общий
это ответ
Здравствуйте, Никонова Анастасия Сергеевна.

При каждой итерации нужно значение n!. Но с предыдущей итерации известно значение (n-1)!. Используем рекурсивную формулу. Внутренний цикл производит вычисления, которых можно было избежать.

Приложение:
/*
Вычислить сумму бесконечного ряда: S=1+2/2!+3/3!+4/4!........
1. Для указанного количества членов ряда
2. С заданной точностью
(точность и количество членов ряда вводятся клавиатуры)
*/
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
void main()
{
int i, n;
float eps;
double S,a;
S=1;
a=1;
printf ("Vvedite kolichestvo chisel v posledovatel`nosti\n");
scanf ("%i", &n);
printf ("Vvedite tochnost\n");
scanf ("%f", &eps);

for (i=2; i<=n; i++)
{
S=S+a;
a/=i;
}
printf ("summa %d chlenov %g\n", n,S);
S=1;
a=1;
i=2;
while(a>eps)
{
S=S+a;
a/=i;
i++;

}
printf ("summa s tochnostu %e = %g\n", eps, S);
getch();
}
Форма ответа