Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритми та структури даних ЗПІ-91-20210115T104612Z-001 / Лекція 2. Способи запису алгоритмів.docx
Скачиваний:
35
Добавлен:
15.01.2021
Размер:
138.41 Кб
Скачать

2.5. Алгоритм знаходження найбільшого спільного дільника двох чисел (алгоритм Евкліда).

Найбільший спільний дільник (НСД) - це число, яке ділить без залишку два числа і ділиться саме без залишку на будь-який інший дільник цих двох чисел. Інакше кажучи, це найбільше число, на яке можна без залишку розділити два числа, для яких шукається НСД.

Найбільш відомим алгоритмом знаходження найбільшого спільного дільника (НСД) пари цілих чисел є алгоритм Евкліда.

Для вирішення цієї задачі можна реалізувати 2 версії алгоритму: діленням і відніманням.

Словесний опис алгоритму пошуку нсд діленням:

1. Більше число ділимо на менше.

2. Якщо число ділиться без залишку, то менше число і є НСД (слід вийти з циклу).

3. Якщо є залишок, то більше число замінюємо на залишок від ділення.

4. Переходимо до пункту 1.

Блок-схема алгоритму Евкліда

Приклад:

Знайти НСД для 30 і 18.

30/18 = 1 (залишок 12)

18/12 = 1 (залишок 6)

12/6 = 2 (залишок 0). Кінець: НСД – це дільник. НСД (30, 18) = 6

Реалізація алгоритму на мові C#

static void Main(string[] args)

{

// Пошук НСД двох чисел діленням

int a = 30; //

int b = 18; //

int temp = 0;

while (b != 0)

{

temp = b;

b = a % b;

a = temp;

}

Console.WriteLine("НСD = " + a);

Console.ReadKey();

}

Словесний опис алгоритму знаходження нсд відніманням

1. Від більшого числа віднімаємо менше.

2. Якщо результат 0, то числа однакові і це є НСД (слід вийти з циклу).

3. Якщо результат віднімання не дорівнює 0, то більше число замінюємо на результат віднімання.

Переходимо до пункту 1.

Приклад:

Знайти НСД для 30 и 18.

30 - 18 = 12

18 - 12 = 6

12 - 6 = 6

6 – 6 = 0 Кінець: НСД (30, 18) = 6

Реалізація алгоритму на мові C#

static void Main(string[] args)

{

// Пошук НСД двох чисел діленням

int a = 30; //

int b = 18; //

int temp = 0;

while (b != 0)

{

temp = b;

b = a - b;

a = temp;

}

Console.WriteLine("НСD = " + a);

Console.ReadKey();

}

2.5. Очислення часу виконання програми

Для визначення часової складності роботи алгоритму треба вміти обчислювати час його виконання.

Для цього в C# є спеціальний клас Stopwatch з простору System.Diagnostics:

Приклад. Обчислення часу роботи програми з використанням класу Stopwatch

Stopwatch sw = new Stopwatch(); //створення об’єкту класу

sw.Start(); //запуск таймера

// код реалізації алгоритму;

sw.Stop(); //зупинення таймера

TimeSpan ts = sw.Elapsed; // ts – час виконання

Console.WriteLine("Total time: {0}", ts.TotalMilliseconds);

При оцінці продуктивності необхідно врахувати, що час виконання алгоритму залежить від багатьох параметрів. Тому бажано оцінювати середній час виконання при декількох прогонах алгоритму, виключаючи перший прогін.

Контрольні запитання і завдання для самостійного виконання

1. Які форми запису алгоритмів вам відомі?

2. Словесний запис алгоритму

3. Запис алгоритмів у формі блок-схеми.

4. Запис алгоритмів на мові програмування.

5. Поясніть сенс використання базових конструкцій структурного програмування.

6. Скласти блок-схему алгоритму обчислення (2*n!-1) Реалізувати наведений приклад на ПК на C#.

7. Скласти блок-схему алгоритму обчислення n-го числа Фібоначчі для вказаного n. Реалізувати на ПК на C#.

8. Скласти блок-схему і програму на мові Паскаль знаходження послідовності з n простих чисел.

9. Скласти блок-схему і програму на мові C# для знаходження найбільшого і найменшого з трьох чисел.

10. Скласти блок-схему і програму на мові C# для створення масиву чисел, заповнення його цілими числами і обчислення суми і середнього арифметичного елементів масиву.

11. Скласти блок-схеми алгоритмів пошуку НСД двох чисел діленням і відніманням.