Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Помогите решить задачу с длинными числами!


Автор: molodzo 4.3.2009, 19:52
Задача:

k изменяется от 0 до бесконечности ((4k+1)! / [(2k)!]^2) * x^2k = =1/2*[(1-4x)^(-3/2) + (1+4x)^(-3/2)]

X принадлежит интервалу [-1/4 ; 1/4)

Найти мин. k, которое будет удовлетворять условию: 
abs(правая часть - левая часть) < 10^(-15)


Вот код(тока у меня не работает):


Код:

#include <iostream.h>
#include <conio.h>
#include <math.h>

long double k,x2,x,p,p2,n,znam,znam1,znam2,p3,my_res,p4,p5,p6,p7,p8,sum1,sum2,ch,sravn;
long double factorial(long double);

main()
{
k=-1;
x2=pow(1/10,15);
do
{
      my_res=1;
      x=-0.25;
      k=k+1;
      p=4*k+1;
      ch=factorial(p);
      p2=2*k;
      znam=factorial(p2);
      znam1=znam*znam;

         do
         {
            x=x+x2;
            if (2*k>=0) p3=pow(x,2*k);
            else p3=(1/(pow(x,abs(2*k))));
            sum1=ch/znam1*p3;

            p4=1-4*x;
            p5=(1/(pow(p4,3/2)));
            p6=1+4*x;
            p7=(1/(pow(p6,3/2)));
            p8=p5+p7;
            sum2=0.5*p8;
            sravn=pow(1/10,15);
         }
         while ((x<=0.25) && (abs(sum1-sum2)>=sravn));

         if(abs(sum1-sum2)<sravn)
            {
               cout<<"Sum1="<<sum1;
               cout<<"Sum2="<<sum2;
               cout<<"K="<<k;
               getch();
               break;
            }
         else continue;
      }
while(abs(sum1-sum2)>=sravn);
getch();
}

long double factorial(long double n)
{
   if (n==1) {exit(1);}
   else
   {
      my_res=my_res*n;
      factorial(n-1);
   }
}

Помогите, пожалуйста, ее решить!

Автор: zim22 4.3.2009, 20:04
Первый раз в жизни я вижу такой способ "вычисления" факториала:
Код
 if (n==1) {exit(1);}


Попробуй так:
Код
long double factorial(long double n)
{
    if (n > 1)        
        return factorial(n-1) * n;
    else
        return 1;
}


***********
Наваял код. Ты не написал с каким шагом изменяется x и к. поэтому я выставил 0.1 в 15 степени. Т.е. очень маленький шаг инкремента. Программа будет высчитывать значение лет 5.  smile 
Код
#include <cmath>
#include <iostream>

using std::cout;
using std::endl;

double factorial(double val)
{
    if (val > 1)
        return factorial(val - 1) * val;
    return 1;
}

int main(int argc, char *argv[])
{    
    double x = -1. / 4;    
    double k = 1;
    double left = 0, right = left;        
    double step = pow(1. / 10, 15);

    do
    {    
        left = factorial(4 * k + 1) / pow(static_cast<double>(factorial(2 * k)), 2) * pow(static_cast<double>(x), 2 * k);    
        right = 1. / 2 * pow(static_cast<double>(1 - 4 * x), -3. / 2) + pow(static_cast<double>(1 + 4 * x), -3. / 2);        
        x += step;
        
        if (x >= 1. / 4)
            x = -1. / 4, k += step;
    }
    while (abs(right - left) >= pow(static_cast<double>(10), -15));

    cout << k << endl;

    return 0;
}



Автор: molodzo 4.3.2009, 23:22
zim22, Спасибо большое! Препод на самом деле говорит, что она может целую ночь вычислять)
Тока на моем компиляторе что-то прога не работает(... Можешь мне скинуть свой?

Автор: Anikmar 5.3.2009, 01:03
Цитата(molodzo @  4.3.2009,  23:22 Найти цитируемый пост)
Тока на моем компиляторе что-то прога не работает(... Можешь мне скинуть свой? 

Компилятор?!  smile 

Автор: zim22 5.3.2009, 08:48
molodzo, а это у тебя компилируется? если да, то какие ошибки выдаёт моя прога?
Код

int main(int argc, char *argv[])
{
return 0;
}


Автор: molodzo 5.3.2009, 09:47
Вот такие ошибки:

Error:  name.cpp(1,2):Unable to open include file 'CMATH.h'
Error:  name.cpp(4,5):Qualifier 'std' is not a class or namespace name
Error:  name.cpp(4,7):Identifier expected
Error:  name.cpp(5,10):Qualifier 'std' is not a class or namespace name
Error:  name.cpp(5,12):Identifier expected
Error:  name.cpp(19,23):Call to undefined function 'pow'
Error:  name.cpp(30,16):Call to undefined function 'abs'
Warn :  name.cpp(35,2):Parameter 'argc' is never used
Warn :  name.cpp(35,2):Parameter 'argv' is never used

Даже не знаю,что делать...  smile 

Автор: zim22 5.3.2009, 10:59
molodzo, так попробуй
Код
#include <math.h>
#include <stdio.h>

double factorial(double val)
{
    if (val > 1)
        return factorial(val - 1) * val;
    return 1;
}

int main(int argc, char *argv[])
{    
    double x = -1. / 4;    
    double k = 1;
    double left = 0, right = left;        
    double step = pow(1. / 10, 15);

    do
    {    
        left = factorial(4 * k + 1) / pow(static_cast<double>(factorial(2 * k)), 2) * pow(static_cast<double>(x), 2 * k);    
        right = 1. / 2 * pow(static_cast<double>(1 - 4 * x), -3. / 2) + pow(static_cast<double>(1 + 4 * x), -3. / 2);        
        x += step;
        
        if (x >= 1. / 4)
            x = -1. / 4, k += step;
    }
    while (abs(right - left) >= pow(static_cast<double>(10), -15));

    printf("%f\n", k);

    return 0;
}


Автор: molodzo 5.3.2009, 18:50
Теперь программа начинает работу, но сразу же пишет в досе  pow: DOMAIN error smile 
А как она у тебя работает? 

Автор: zim22 5.3.2009, 19:30
molodzo, прежде чем задавать вопрос, погугли что-ли.

The pow functions compute x raised to the power y. A domain error occurs if x is finite and negative and y is finite and not an integer value. A domain error may occur if x is zero and y is less than or equal to zero. A range error may occur.

Поменяй значения, посмотри как прога с ними работает.  У меня выдаёт 43.00000.
это
Код

 double step = pow(1. / 10, 15);

поменяй на это:
Код

double step = 0.0001;


а это:
Код
  x = -1. / 4, k += step;

на это:
Код

  x = -1. / 4, k += 1;

Автор: molodzo 8.3.2009, 15:05
Ребят! Наконец-то установил C++  Builder 2007! Теперь прога ошибок не выдает!  smile 
Однако, рез-т тоже не появляется... пробовал добавить в код: Form1->Edit1->Text=k;   но он ее не распознает k! А если сделать K глобальной переменной, то выводит 1... как  быть?

Автор: zim22 8.3.2009, 19:21
molodzo, если у вас есть вопросы по Builder - обращайтесь в соотв.раздел форума 
http://forum.vingrad.ru/forum/borland-c++builder.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)