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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите решить задачу с длинными числами! 
:(
    Опции темы
molodzo
Дата 4.3.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Задача:

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);
   }
}

Помогите, пожалуйста, ее решить!
PM MAIL   Вверх
zim22
Дата 4.3.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Первый раз в жизни я вижу такой способ "вычисления" факториала:
Код
 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;
}




Это сообщение отредактировал(а) zim22 - 4.3.2009, 20:59


--------------------
PM MAIL   Вверх
molodzo
Дата 4.3.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



zim22, Спасибо большое! Препод на самом деле говорит, что она может целую ночь вычислять)
Тока на моем компиляторе что-то прога не работает(... Можешь мне скинуть свой?
PM MAIL   Вверх
Anikmar
Дата 5.3.2009, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

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



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

Компилятор?!  smile 
PM MAIL ICQ   Вверх
zim22
Дата 5.3.2009, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



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

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




--------------------
PM MAIL   Вверх
molodzo
Дата 5.3.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот такие ошибки:

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 
PM MAIL   Вверх
zim22
Дата 5.3.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



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;
}




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


Новичок



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

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



Теперь программа начинает работу, но сразу же пишет в досе  pow: DOMAIN error smile 
А как она у тебя работает? 
PM MAIL   Вверх
zim22
Дата 5.3.2009, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



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;



--------------------
PM MAIL   Вверх
molodzo
Дата 8.3.2009, 15:05 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ребят! Наконец-то установил C++  Builder 2007! Теперь прога ошибок не выдает!  smile 
Однако, рез-т тоже не появляется... пробовал добавить в код: Form1->Edit1->Text=k;   но он ее не распознает k! А если сделать K глобальной переменной, то выводит 1... как  быть?
PM MAIL   Вверх
zim22
Дата 8.3.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



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


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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