Страница 1 из 1
Последовательность построенная по правилу
Добавлено: 20 май 2016, 05:13
Ronin94
Люди спасайте, не могу написать код хоть убейся, задание вроде не сложное а сделать не получается
Даны положительные x,d. Найти номер и значение первого члена последовательности a, построенной по правилу:
а[1]=(х+1)/2, a= (a[i-1]+(x/a[i-1])/2, i=2,3,..., квадрат которого отличается от числа х не более чем на d.
Вот что я пытался сделать:
Код: Выделить всё
#include<iostream>
#include<cmath>
using namespace std;
void posled(int x, int n)
{
double *a, p;
a=new double[n];
for(int i=1; i=n; i++)
{
if(i=1)
{
a[1]=((x+1)/2);
}
else
{
a[i] = ((a[i-1]+(x/a[i-1])/2));
}
p=pow(a[i],2);
cout << "a[" << i << "] = " << a[i] << endl;
}
}
int main()
{
setlocale(0,"rus");
int n;
double x,d;
cout << "Введите значение х: ";
cin >> x;
cout << "Введите значение d: ";
cin >> d;
cout << "Введите размер последовательности: ";
cin >> n;
posled(x, n);
system("pause");
return 0;
}
Очень буду признателен)))
Re: Последовательность построенная по правилу
Добавлено: 20 май 2016, 09:27
Romeo
Во-первых, тебе вовсе не нужны все члены последовательности, так что массив тут излишен. Вполне достаточно одной переменной, значение которой на каждом шаге будет вычисляться через её старое значение. Это в том числе избавит от необходимости вводить n, которое явно не подразумевается, судя по постановке задачи.
Во-вторых, ты никак не использовал
d, хотя и считал его из входного потока. Очевидно, что
d должно участвовать в условии выхода из цикла. Слова в задании "отличается не более чем" на самом деле обозначают "разность по модулю меньше либо равна чем". Модуль вычисляется с помощью функции
fabs.
Исходя из всего вышесказанного предлагаю следующий алгоритм (пседвокод):
Код: Выделить всё
Считать Икс;
Считать Д;
А := (Икс + 1)/2;
Номер := 1;
Пока (Модуль(А*А - Икс) > Д)
{
А := (А + Икс)/А;
Инкремент Номер;
}
Вывести А;
Вывести Номер;
Re: Последовательность построенная по правилу
Добавлено: 25 май 2016, 16:21
Ronin94
Исправил, заработало...но когда за d я принимаю к примеру 0.001 программа перестает что либо делать. пробовал менять типы переменных. в одном случае получалось что вычисление неточное, в другом при вводе значения х больше 10 ввод d блокировался
Код: Выделить всё
#include<iostream>
#include<cmath>
using namespace std;
void posled(double x, double d)
{
double a;
a=((x+1)/2);
int i=1;
while((abs((a*a)-x))>d)
{
a=((a+x)/a);
i++;
}
cout<<"a[" << i <<"] = "<< a << endl;
}
int main()
{
setlocale(0,"rus");
int n;
double x,d;
cout << "Введите значение х: ";
cin >> x;
cout << "Введите значение d: ";
cin >> d;
posled(x, d);
system("pause");
return 0;
}
Re: Последовательность построенная по правилу
Добавлено: 25 май 2016, 16:37
Romeo
В смысле перестаёт что-либо делать? Зависает? Можешь привести примеры конкретных значений a и d, которые нужно ввести, чтобы добиться такого поведения программы?
Надеюсь, ты понимаешь, что твой алгоритм фактически моделирует вычисление членов сходящейся последовательности, так что x не может быть произвольным числом. В качестве x должен быть указан предел, к которому последовательность сходится, иначе условие в цикле всегда будет оставаться ложным для достаточно малых d.
Re: Последовательность построенная по правилу
Добавлено: 25 май 2016, 20:34
Ronin94
к примеру я ввожу x=10, d=0.001 после ввода программа перестает что либо делать, просто стоит консоль и никаких действий не происходит нажатия клавиш не реагируются
Re: Последовательность построенная по правилу
Добавлено: 26 май 2016, 16:01
Romeo
Ага, я всё понял. Последовательность расходящаяся получилась, так как я упустил деление на два. Должно быть вот так:
Мог бы и сам формулу проверить, между прочим
