Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычисление ряда 
V
    Опции темы
Tiglon
Дата 6.2.2012, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.12.2011

Репутация: нет
Всего: нет



Всем дорого время суток. Си++ начал изучать относительно недавно. Вот нужна помощь разбирающихся людей.
Есть задание "найти суму 9 членов ряда в котором a(n)=a!/(2n)!"
вот пока написал вычисление факториала

Код

#include <iostream.h>
#include <conio.h>
void main()
{
clrscr();
float i,fact=1,n,a=1,b=1,q=1;
cout << "Vvedite i " "\n";
cin >> i;
for (n=1; n<=i; n++)
{
q*=n; // вычисление числителя 
}
for (n=1; n<=i*2; n++)
{
b*=n; // вычисление знаменателя 
}
getch();
}


Я так понимаю что тут надо все написать в одном цикле а не в разных ? И проблема моя в том что я не понимаю как это сделать  . 
Помогите пожалуйста.
PM MAIL   Вверх
ambler
Дата 7.2.2012, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.10.2009

Репутация: нет
Всего: нет



Цитата

Есть задание "найти суму 9 членов ряда в котором a(n)=a!/(2n)!"

А условие точно такое?  a! ?  
PM MAIL   Вверх
feodorv
Дата 7.2.2012, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(ambler @  7.2.2012,  00:13 Найти цитируемый пост)
a! ?   

Наверное, все же, a**n.

В принципе, не нужно каждый шаг вычислять a**n и (2n)!, когда известен предыдущий член ряда:
Код

Э(n+1) = Э(n) * a / ((2n+1) * (2n+2))


Вот так в цикле и вычислять:
Код

#include <stdio.h>

int main( void )
{
  double sum, a, elem;
  int i;

  a = 0.5;
  sum = elem = 1.;

  for( i = 0; i < 9; i++)
  {
    elem = elem * a / ((double) (2*i+1) * (double) (2*i+2));
    sum += elem;
  }

  printf( "a = %f, sum = %f\n", a, sum);
  return 0;
}


Это если считать от n=0 до n=8 (9 членов ряда);


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Tiglon
Дата 7.2.2012, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.12.2011

Репутация: нет
Всего: нет



Цитата(ambler @  7.2.2012,  00:13 Найти цитируемый пост)
А условие точно такое?  a! ?


да. все правильно.
вот условие.

user posted image


PM MAIL   Вверх
ambler
Дата 7.2.2012, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 27.10.2009

Репутация: нет
Всего: нет



Цитата

да. все правильно.

все же n!

при n = 1 ... 9 получаем 
Код

#include <iostream>

using namespace std;

double sum_of_series(unsigned int n)
{
    double sum = 0;
    unsigned int numerator = 1;
    unsigned int denominator = 1;

    for (int i=1; i<=n; i++)
    {
        denominator = 1;
        for (int k=i+1; k<=2*i; k++)
            denominator *= k;
        sum += (double)numerator/denominator;
    }

    return sum;
}


int main()
{
    double s= sum_of_series(9);
    cout << s << endl;
    return 0;
}



Это сообщение отредактировал(а) ambler - 7.2.2012, 12:33
PM MAIL   Вверх
feodorv
Дата 7.2.2012, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Tiglon @  7.2.2012,  10:33 Найти цитируемый пост)
да. все правильно.

Гм. a! и n! всё же немного отличаются)))

Ну тогда:
Цитата

Э(n+1) = Э(n) * (n + 1) / ((2n+1) * (2n+2))


В итоге:
Код

#include <stdio.h>
int main( void )
{
  double sum, elem;
  int n;
  sum = elem = 1.;
  for( n = 0; n < 9; n++)
  {
    elem = elem * (double) (n+1) / ((double) (2*n+1) * (double) (2*n+2));
    sum += elem;
  }
  printf( "sum = %f\n", sum);
  return 0;
}



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Tiglon
Дата 7.2.2012, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.12.2011

Репутация: нет
Всего: нет



Цитата(feodorv @  7.2.2012,  12:38 Найти цитируемый пост)
Гм. a! и n! всё же немного отличаются)))


Ой извиняюсь. Даже не заметил smile.
PM MAIL   Вверх
Tiglon
Дата 7.2.2012, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.12.2011

Репутация: нет
Всего: нет



Спасибо большое.
Только я вот не понимаю зачем здесь везде писать тип данных.
Цитата(feodorv @  7.2.2012,  12:38 Найти цитируемый пост)
elem = elem * (double) (n+1) / ((double) (2*n+1) * (double) (2*n+2));


PM MAIL   Вверх
feodorv
Дата 7.2.2012, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(Tiglon @  7.2.2012,  16:48 Найти цитируемый пост)
Только я вот не понимаю зачем здесь везде писать тип данных.


Теоретически, компилятор понимает, что в начале выражения стоит elem с типом double, поэтому он будет приводить к double остальные члены выражения.

Однако, кто знает, может потом захочется модифицировать программу. Например:
Код
double elem, mnozhitel;
...
mnozhilel =  (n+1) / ((2*n+1) * (2*n+2));
...
elem = elem * mnozhitel;

Забыв о приведении типов, Вы получите неверный результат.

Кроме того, для малых значений n значение выражения (2*n+1) * (2*n+2) не превысит INT_MAX, но в другом месте гарантировать этого никто не сможет, поэтому лучше типы привести, чем не привести, кмк...



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Tiglon
Дата 7.2.2012, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 1.12.2011

Репутация: нет
Всего: нет



Ясно.
Еще раз спасибо.

И я вот еще думаю что переманенная sum должна равняться 0.
Цитата(feodorv @  7.2.2012,  12:38 Найти цитируемый пост)
sum = elem = 1.;



Это сообщение отредактировал(а) Tiglon - 7.2.2012, 19:10
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1014 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.