это В §9 описан алгоритм нахождения наибольшего общего делителя (алгоритм
Евклида), ориентированный на исполнителя-человека. Представьте его в
виде блок-схемы и на алгоритмическом языке для исполнителя-компьютера.
Выполните предыдущее задание, проведите трассировку алгоритма Евклида для нахождения НОД чисел 128 и 56
Идея такая: разбиваем отрезок [a, b] на два: [a, m] и [m, b], где m = (a + b)/2. Длина такого отрезка h = b - a. Cмотрим значения функции f в точках m - ε и m + ε. Если f(m - ε) < f(m + ε), то думаем, что функция возрастает в точке m, и разумно искать ответ на отрезке [a, m]; если f(m - ε) > f(m + ε), то оставляем отрезок [m, b]. Если нам ОЧЕНЬ не повезло, и f(m - ε) = f(m + ε), то оставим отрезок [m - h/4, m + h/4]. При этом в любом случае длина нового отрезка будет h/2. В качестве ε разумно взять желаемую точность, и останавливаться, если новая длина h/2 окажется меньше ε.
Очень маленький ε ставить не следует, при этом очень большую роль начинаю играть ошибки округления.
Точный ответ можно найти, посчитав производную. Должно получиться![1/\sqrt{3}](/tpl/images/1356/6724/0de4c.png)
Реализация (python 3.7):
from math import sqrt
def find_min(function_to_minimize, left, right, tolerance=1e-6):
assert left <= right
# print(left, right) # если хотите проследить за тем, как меняются границы
length = right - left
if length <= tolerance:
return left
midpoint = (left + right) / 2
y_left, y_right = function_to_minimize(midpoint - tolerance), function_to_minimize(midpoint + tolerance)
if y_left < y_right:
return find_min(function_to_minimize, left, midpoint, tolerance)
elif y_left > y_right:
return find_min(function_to_minimize, midpoint, right, tolerance)
else:
return find_min(function_to_minimize, midpoint - length / 4, midpoint + length / 4)
calculated = find_min(lambda x: x ** 3 - x, 0, 1)
exact = 1 / sqrt(3)
print(calculated)
print(calculated - exact)
Мне выводится ответ 0.5773496627807617
Разница между точным решением и найденным примерно![6\cdot10^{-7}](/tpl/images/1356/6724/1bf95.png)
все алгоритмы циклические
Объяснение:
1.
#include <iostream>
using namespace std;
int main()
{
int b,q,N;
cin>>b>>q>>N;
for(int i=0;i<N;i++){
b*=q;
cout<<b<<endl;
}
return 0;
}
2.
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
int main()
{
int x, d;
cin>>x>>d;
double D, y1=x, y;
y=(x/y1+y1)/2;
if(y1-y>0.0000000001){
D=y1-y;
}
else{
D=y-y1;
}
while(D>d){
y=(x/y1+y1)/2;
if(y1-y>0.0000000001){
D=y1-y;
}
else{
D=y-y1;
}
y1=y;
}
cout<<x<<" ";
cout<<fixed;
cout<<setprecision(5)<<y;
return 0;
}