#include <locale>
#include <iostream>
#include <stdexcept>
using namespace std;
// Требуемая функция.
double f(double x,unsigned short n,unsigned short m)
{
if(m>n)
{
throw invalid_argument("Параметр m не может быть больше n");
}
// Вычисления будем производить по рекуррентной формуле
// U(x,i+1)=F(U(x,i),i)=U(x,i)*x*x/((2*i+1)*(2*i+2))
// квадрат x
const double x2=x*x;
// curr - U(x,i)-текущий элемент последовательности
double curr=1.0;
unsigned int t=0;
// Пропустим элементы до i=m
while(m--)
{
--n;
curr*=x2/(t+1)/(t+2);
t+=2;
}
double result=curr;
// Дальше вычисляем рекуррентно
while(n--)
{
result+=curr*=x2/(t+1)/(t+2);
t+=2;
}
return result;
}
// Ф-я для оформления вывода при тестировании
void test(double x,unsigned short n,unsigned short m)
{
cout<<"f("<<x<<","<<n<<","<<m<<")=";
try
{
cout<<f(x,n,m);
}
catch(invalid_argument& ex)
{
cout<<ex.what();
}
cout<<endl;
}
int main()
{
locale::global(locale(""));
test(-5,4,5);
test(-5,0,0);
test(-5,1,0);
test(-5,3,3);
test(-5,3,2);
test(10,18,11);
system("PAUSE");
return 0;
}
f(-5,4,5)=Параметр m не может быть больше n
f(-5,0,0)=1
f(-5,1,0)=13.5
f(-5,3,3)=21.7014
f(-5,3,2)=47.7431
f(10,18,11)=10.7935
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.