- •Поняття алгоритму, його властивості, класифікація
- •Особливості алгоритму:
- •Основи алгоритмізації обчислювальних процесів Етапи вирішення задач на еом
- •Обчислення нсд методом послідовного перебору
- •Обчислення нсд методом розкладу пари чисел на прості множники
- •Структурограма:
- •Синтаксична діаграма:
- •Графічна мова:
- •Класифікація алгоритмів
- •Намалюємо блок-схему АлгоритмуЕвкліда:
- •In, ik, di
- •Найбільш поширені типи задач
- •Чисельні задачі
In, ik, di
in – стратове значення
ik – кінцеве значення
d
тіло циклу
і– параметр циклу
Те, що міститься в тілі циклу, повинно впливати на умову циклу. Умова повинна бути написана із коректних значень і виразів, що визначені ще до першого виконання циклу.
Реалізація алгоритму суми ряду
Як зазначалося раніше, один і той же алгоритм можна представити кількома способами. Для демонстрації цієї особливості алгоритму розглянемо знаходження суми натурального ряду чисел ві 1 до 100. Спочатку зобразимо даний алгоритм у вигляді блок-схеми.
Опишемо даний алгоритм на мові Pascal.
початок i:=1; S:=0 S:=S+i i:=i+1 i<=100 S
кінець Спосіб 1. Program sum1; const N=100; var i, S: integer; begin i:=1; S:=0; while i<=100 do begin S:=S+i; i:=i+1 end; write(‘S=’,S) end.
Спосіб 2. Program sum2; const N=100; var i, S: integer; begin i:=1; S:=0; repeat S:=S+i; i:=i+1 until i>N; write(‘S=’,S) end. Спосіб 4. Program sum4; const N=100; var i, S: integer; begin S:=0; for i:=N downto 1 do S:=S+i; write(‘S=’,S) end.
S:=0;
i:=1 i:=1,n S:=S+i Спосіб 3. Program sum3; const N=100; var i, S: integer; begin S:=0; for i:=1 to n do S:=S+i; write(‘S=’,S) end.
Алгоритм знаходження простих чисел (решето Ератосфена)
Розглянемо алгоритм генерації послідовності простих чисел, що не перевищує заданого довільного числа. Нагадаємо, що простим вважають таке ціле додатнє число, якщо воно має тільки два дільники – саме це число та 1. Число 1 не є простим. Для початку складемо послідовність цілих чисел від 2 до n, із якого ми повинні будемо вибирати прості числа. На першому проході ми видаляємо всі числа, котрі діляться на 2, тобто 4, 6 і т.д. Потім із списку вибирають наступний елемент (в даному випадку 3) та видаляємо із списку всі числа, що діляться на нього. В цій версії простого алгоритму існує деяка накладка, так як деякі із чисел, наприклад 6, повинні видалятися із списку більше одного разу. Для числа 4 не потрібно виконувати спеціальний прохід по циклу, так як число 4 кратне 2, тому воно буде видалене із списку на першому проході. Точно так не потрібно виконувати прохід і для всіх інших чисел, що були видалені із списку в попередніх проходах.
Наступним числом, що залишилось в списку та використовується на третьому проході буде число 5. Робота алгоритму продовжується до тих пір, поки в списку існують числа, які можна видалити. Числа, що залишилися після проходу алгоритму – прості.
Для прикладу розглянемо процес пошуку простих чисел, що не перевищують n=25:
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
2 3 5 7 9 11 13 15 17 19 21 23 25
2 3 5 7 11 13 17 19 23 25
2 3 5 7 11 13 17 19 23
Для цього прикладу не потрібно більшої кількості проходів по списку, так як із нього на розглянутих проходах видалені всі складені числа. Таким чином, в списку залишились тільки впорядковані прості числа, менші або рівні 25.
Виникає питання: при якому найбільшому значенні числа p в списку ще залишаються кратні йому числа? Якщо p – число, кратні якому підлягають видаленню із списку на даному проході, то почати розгляд слід з числа p*p, оскільки всі менші кратні йому числа - 2p, …, (p-1)p вже були видалені на попередніх проходах. Це спостереження дозволить запобігти видаленню із списку одного і того ж числа більше одного разу. Очевидно, що p*p не повинно перевищувати n, тому значення p не повинно перевищувати , заокруглення до цілого числа в нижню сторону. На математичній мові це записується як, тобто за допомогою функції, що називають «підлога» (заокруглення вниз,floor).
Намалюємо блок-схему алгоритму «Решето Ератосфена».
початок
n>=2 p<=n A[p]:=p p:=p+1 p:=2 p*p<=n A[p]<>0 p:=p+1 j:=p*p j<=n A[j]:=0; j:=j+p i:=2; p:=2 p<=n A[p]<>0 L[i]:=A[p] i:=i+1 p:=2 p:=p+1 L[i]
кінець
+
-
+
-
+
-
+
-
+
-
+
-
Program resheto_Eratosphena;
const n=100;
var i, j, p: integer;
A: array[2..n] of integer;
L: array[2..n] of integer;
begin
for p:=2 to n do
begin
A[p]:=p;
write(A[p],’ ‘)
end;
writeln;
for p:=2 to trunc(sqrt(n)) do
if A[p]<>0 then
begin
j:=p*p;
while j<=n do
begin
A[j]:=0;
j:=j+p
end
end;
i:=2;
for p:=2 to n do
if A[p]<>0 then
begin
L[i]:=A[p];
write(L[i],’ ‘);
i:=i+1
end;
writeln;
readln;
end.