Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.10.2014, 23:25   #1
Angre
Новичок
Джуниор
 
Регистрация: 09.10.2014
Сообщений: 2
Сообщение C++ - Сумма бесконечного ряда с факториалом

Найти сумму ряда с заданной точностью e = 0,001, общий член которого:
a с индексем n= n! / pow(n,n)
Проблема в том, что вычислить надо не с помощью функции, а с помощью for, while или do-while.

Код:
#include <iostream.h>
#include <math.h>
int main()
{
int n, f= 1, i= 1;
double a;
do
{
f= f * i;
i++;
do
{
a= a + f/ pow(n,n);
n++;}
while(a > 0.001);}
while( i <= n );
cout« a;

return 0;
}

И такой:
#include <iostream.h>
#include <math.h>
int main()
{
int n= 1, i, f;
double a= 1.00;
do
{for(i=1; i <= n; i++ )
{n++;
f= f * i;}
a= a + f/pow(n,n);
n++;
}
while( a > 0.001 );
cout« a;
return 0;
}

Последний раз редактировалось Stilet; 13.10.2014 в 10:55.
Angre вне форума Ответить с цитированием
Старый 10.10.2014, 00:48   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

и? где проблема?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 10.10.2014, 06:24   #3
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

В первом нужно инициализировать a перед началом суммирования и инициализировать n.Заданная точность это разница между двумя последовательно вычисленными значениями a, а не само а, поэтому сравнение а с 0.001 некорректно. В классе cout нет переопределенного оператора «, а есть оператор <<. Факториал растет очень быстро, в общем случае нужна длинная арифметика.
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 10.10.2014, 09:40   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

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

Код:
#include <iostream>
#include <stdexcept>

unsigned int factorial( unsigned int n ) throw (std::out_of_range)
{
    static const unsigned int table[] = { 1, 1, 2, 6, 24, 120, 720,
                                          5040, 40320, 362880, 3628800,
                                          39916800, 479001600 };
    if ( n >= sizeof table / sizeof *table )
        throw std::out_of_range( "Range error: the number must be from the range [0, 12]" );
    return table[n];
}

int main( )
{
    int f = 0;
    int n = 12;

    try {
        f = factorial( n );
        std::cout << f << std::endl;
    } catch ( const std::out_of_range& e ) {
        std::cout << e.what( ) << std::endl;
    }

    return 0;
}
8Observer8 вне форума Ответить с цитированием
Старый 10.10.2014, 15:49   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
По поводу факториала могу подсказать.
И нарваться на переполнение! (вот такой он факториал вредный больше 10! вряд ли кто посчитает без ухищрений (длинная арифметика).

Код:
n:=????
s:=0;
repeat
r:=1;  for k:=1 to n do r:=r*k/n;  /// r:=(1/n)*(2/n)*...*(n/n);
s:=s+r;
until r<0.001;
Это конечно же не С.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.10.2014 в 15:52.
evg_m на форуме Ответить с цитированием
Старый 10.10.2014, 19:41   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
И нарваться на переполнение!
В коде из моего сообщения нет переполнения. Там факториал уже подсчитан. Функция factorial() выдаёт значение из таблицы. Если пользователь введёт 13, то ему программа покажет сообщение о некорректных данных. Такой способ быстрее, чем расчёт

Последний раз редактировалось 8Observer8; 10.10.2014 в 19:44.
8Observer8 вне форума Ответить с цитированием
Старый 13.10.2014, 09:50   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
В коде из моего сообщения нет переполнения.
Цитата:
Если пользователь введёт 13, то ему программа покажет сообщение о некорректных данных.
А какая пользователю разница получить переполнение или сообщение о некорректных данных. Результатом обеих ситуаций будет одно и то же невозможность произвести расчет.

Цитата:
Такой способ быстрее, чем расчёт
Ощутимая разница будет заметна при миллионах повторных расчетов 13!
В нашем случае удастся провести только тринадцать.(1!... 13!)
А дальше "...некорректные данные".

Мой код позволит рассчитать и за пределами 13! БЕЗ каких либо выкрутасов (вроде длинной арифметики).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.10.2014 в 09:57.
evg_m на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сумма бесконечного ряда LittleBob Помощь студентам 0 09.12.2012 18:53
Сумма бесконечного ряда IGOR199304 Помощь студентам 0 25.11.2012 23:07
сумма бесконечного ряда unbanned Паскаль, Turbo Pascal, PascalABC.NET 8 18.03.2012 12:47
Сумма бесконечного ряда vetal0007 Паскаль, Turbo Pascal, PascalABC.NET 3 12.02.2012 00:32
Сумма бесконечного ряда random7 Паскаль, Turbo Pascal, PascalABC.NET 3 18.09.2009 20:41