Числа Фибоначчи вычисляются по следующему правилу:
F1 = 1, F2 = 1, Fi = Fi-1 + Fi-2.
Обозначим Fi, Fi-1 и Fi-2 как F1, F2 и F3.
Начнем с того, что присвоим начальные значения, равные 1, F2 и F3, а дальше будем повторять следующие действия: F1 = F2; F2 = F3; F3 = F1 + F2. При этом тройка чисел будет смещаться по числовой оси вправо пока не выйдет за правую границу заданного отрезка.
Вычисление чисел Фибоначчи начинается c двух единиц, но выводить будем только те числа, которые попадают в заданный диапазон.
#include<iostream>
#include <math.h>
#include <conio.h>
#include <windows.h>
using namespace std;
int main()
{
//Настройки шрифтов и региональных стандартов
if(SetConsoleCP(1251)==0
{
cerr<<"Fialed to set codepage!"<<endl; //если не удалось установить кодовую страницу, вывод сообщения об ошибке
}
if(SetConsoleOutputCP(1251)==0) //тоже самое для вывода
{
cerr<<"Failed to set OUTPUT page!"<<endl;
}
long a, b, f1, f2 = 1, f3 = 1;
cout<< "Задайте границы отрезка \n";
cin>> a >> b;
cout<< "Числа Фибоначчи на этом отрезке:\n";
while (f2 <= b) // вычисляем, пока не вышли за правую границу отрезка
{
if (f2 >= a) cout<< f2 << " ";
// выводим, если число не меньше левой границы отрезка
f1 = f2;
f2 = f3;
f3 = f1 + f2;
}
cout<< endl;
_getch();
return 0;
}
5. Программа, которая находит значение квадратного корня из заданного числа, используя рекуррентное соотношение:
Обозначим как y1 и y2, а заданную точность как eps.
Взяв в качестве начального значения x/2, будем повторять следующие действия: y1 делаем равным y2, а у2 вычисляем по заданной формуле. При этом пара y1и y2 будет перемещаться по числовой оси, приближаясь к значению . Процесс вычислений можно закончить, когда будет выполняться соотношение: |y1-y2| < , при этом будет выполнено требуемое отношение: | | <= .
#include<iostream>
#include <math.h>
#include <conio.h>
#include <windows.h>
using namespace std;
int main()
{
//Настройки шрифтов и региональных стандартов
if(SetConsoleCP(1251)==0
{
cerr<<"Fialed to set codepage!"<<endl;
}
if(SetConsoleOutputCP(1251)==0)//тоже самое для вывода
{
cerr<<"Failed to set OUTPUT page!"<<endl;
}
double x, eps;
//выполняем ввод данных с проверкой их на допустимость
do
{
cout<< "Задайте x >= 0 ";
cin>> x;
} while (x < 0);
do
{
cout<< "Введите точность > 0 и <1 ";
cin>> eps;
} while (eps <= 0 || eps >= 1);
//выполняем вычисления, используя рекуррентное соотношение:
double y1, y2=x/2;
do
{
y1 = y2;
y2 = y1 + (x/y1 - y1) / 2;
} while (fabs(y2-y1)>=eps);
cout<< "Вычисленное значение корня "<< y2 << endl;
cout<< "контрольное значение " << sqrt(x) << endl;
_getch();
return 0;
}
6. Программа, которая вычисляет сумму ряда
с заданной точностью.
Выражение n! называется факториалом числа n и равно .
Обозначим сумму ряда как s, а очередной элемент ряда (слагаемое) как sl. Начальные значения s и sl нужно взять равными первому члену ряда, а дальше для их вычисления использовать рекуррентные соотношения.
Для вычисления очередного слагаемого используем соотношение:
, где z = 1, 2, 3… Проверьте, что при использовании этого соотношения действительно получаются нужные члены ряда и в знаменателе автоматически образуется факториал. Обратите внимание, что отдельно факториал вычислять не нужно.
#include<iostream>
#include<iomanip>
#include<math.h>
#include<conio.h>
using namespace std;
int main()
{
setlocale(LC_ALL,"rus_rus.1251");
//!!! Настройки шрифтов и региональных стандартов взять от ОС
double e, sl=1, s=1, z=1,x;
cout<<"Введите x ";
cin>>x;
do
{
cout << "Введите точность > 0 ";
cin >> e;
} while (e <= 0);
// выполняем вычисления:
/* повторяем пока не выполнится условие: | s l | <= , при этом сумма ряда будет отличаться от не более чем на */
do
{
sl = sl*x*x / z; // вычисляем очередное слагаемое
s += sl; // добавляем его к сумме
z += 1; // увеличивае z на 1
} while (fabs(sl) >= e);
// повторяем, пока не выполнится условие: | s l | <= , при этом сумма ряда будет
// отличаться от не более чем на .
do
{
sl = sl*x*x / z; // вычисляем очередное слагаемое
s += sl; // добавляем его к сумме
z += 1; // увеличивае z на 1
} while (fabs(sl) >= e);
k | |
0.001 | |
0.01 | |
0.1 | |
// Определим точность вывода результа (k - количество цифр после точки),
// например если точность вычислений = 0.001, то результат должен выводиться с
// тремя знаками после точки. Для вычисления k используем следующий алгоритм: пока // меньше 1, повторяем следующие действия: увеличиваем в 10 раз, k увеличиваем // на 1, например:
int k=0;
while (e < 1)
{
e*=10; ++k;
}
// устанавливает точность вывода манипулятор setprecision(),
// при использовании манипуляторов не забывайте подключать к программе
// заголовочный файл <iomanip>
cout<< "Сумма = " << setprecision(k+1) << s << endl;
cout<< "Контрольное значение: " << exp(x*x)<<endl; _getch();
return 0;
}
7. Пример – программа, которая вычисляет сумму ряда для заданного количества слагаемых.
В этой программе не требуется вводить x и заданную точность, точность определяется количеством слагаемых: чем больше n, тем выше точность вычисления суммы ряда. Для решения этой задачи лучше всего подходит цикл for, поскольку здесь требуется использовать счетчик.
#include <iostream>
#include <iomanip>
#include <math.h>
#include <conio.h>
#include <windows.h>
using namespace std;
int main()
{
if(SetConsoleCP(1251)==0
{
cerr<<"Fialed to set codepage!"<<endl;
}
if(SetConsoleOutputCP(1251)==0)
{
cerr<<"Failed to set OUTPUT page!"<<endl;
}
long double s = 1, sl = 1;
long double n;
cout<<"Введите количество слагаемых ";
cin>>n;
// Вычисляем сумму ряда:
for (long double i =1; i <= n; i++)
{
sl /= i;
/* при использовании рекуррентных соотношений факториал вычисляется автоматически */
s += sl;
}
cout<<"Сумма=" << setprecision(16) << s;
cout<<"\n e=" << exp(1.0) << endl;
_getch();
return 0;
}