„„UT.O
/у Іі і " %
ммшІ, WA 0 Т.П. Караванова
ББК 32.81я721 К21
Схвалено комісією з інформатики Навчально-методичної ради з питань освіти Міністерства освіти і науки України (лист №1.4/18-1450 від 22.06.2007р.)
Р е ц е н з е н т и :
Тимофієва Є.М. - канд. фіз.-мат. наук, доцент Чернівецького національного університету імені Юрія Федьковича;
Мельник В.І. — учитель інформатики Ліцею інформаційних технологій м. Олександрії, заслужений учитель України
Караванова, Т.П.
К21 Інформатика : методи побудови алгоритмів та їх ана ліз : обчисл. алгоритми : навч. посіб. для 9-10 кл . з поглибл. вивч. інформатики / Т.П. Караванова. - К. : Генеза, 2009. - 336 с. : іл. - Бібліогр.: с. 331.
ISBN 978-966-504-731-5.
Навчальний посібник містить достатньо повний об'єм мате ріалу, необхідний для оволодіння навичками побудови алго ритмів різного рівня складності, оптимізації методів їх розробки, оцінки ефективності виконання алгоритмів, вироблення нави чок тестування програм, що реалізують розроблені алгоритми. У посібнику розглянуто питання оптимізації алгоритмів з вико ристанням елементів комбінаторики, теорії графів, лінійного та динамічного програмування, обчислювальної геометрії, алгебра їчних методів розв'язування алгоритмічних задач.
Цей навчальний посібник може бути корисний як при ви вченні алгоритмізації у шкільному курсі з поглибленим вивчен ням інформатики, так і при підготовці учнів інших навчальних закладів до олімпіад, турнірів, конкурсів з інформатики.
Посібник призначений для широкого кола читачів, учителів, а також для учнів, що вивчають інформатику за поглибленою програмою, учнів старших класів загальноосвітніх навчальних закладів, які готуються до олімпіад, конкурсів, турнірів з інфор матики, для студентів училищ, технікумів, середніх спеціаль них навчальних закладів та ВНЗ.
Рекомендується також як навчальний посібник для само стійного вивчення.
|
ББК 32.81я721 |
|
©Караванова Т.П., 2007 |
ISBN 978-966-504-731-5 |
©Видавництво «Генеза»,' |
оригінал-макет, 2009 |
ВІД АВТОРА
Даний навчальний посібник є логічним продовженням посібника «Методи побудови алгоритмів та їх аналіз. Необчислювальні алгоритми». Після ознайомлення з різноманітними алгоритмами, які можна назвати базовими для побудови складних алгоритмів, слід переходити до побудови оптимізаційних алгоритмів.
Володіючи базовими алгоритмічними структурами - ліній ними, розгалуженими і циклічними, можна побудувати алго ритм розв'язку практично будь-якої задачі. Розв'язання склад них алгоритмічних задач, метою яких є пошук кращого з усіх можливих варіантів розв'язків, може бути реалізовано за допо могою повнопереборних алгоритмів. Однак існують різні мето ди, які дають змогу оптимізувати такі задачі і розв'язати їх за мінімальний час. Методи розв'язування таких задач представ лені в інформатиці різними розділами: теорія графів, лінійне та динамічне програмування тощо.
Метою створення даного навчального посібника є не тільки ознайомлення читача з вказаними вище розділами інформати ки, а й вироблення у нього навичок грамотного тестування роз роблених алгоритмів, уміння точно оцінити ефективність робо ти алгоритмів, вибирати найбільш підходящі для кожної кон кретної задачі оптимізаційні методи.
Аналіз значної кількості робіт відомих авторів, присвяче них питанням вивчення методів розв'язування складних алго ритмічних задач, дав мені змогу підійти до розгляду методів побудови алгоритмів з різних точок зору і розташувати ма теріал у найбільш логічній і зручній послідовності.
Оскільки даний навчальний посібник у першу чергу орієнто вано на учнів загальноосвітніх навчальних закладів і молод ших курсів вищих навчальних закладів, то його матеріал мак симально адаптований саме для цієї вікової категорії читачів.
До посібника увійшли не тільки теми, передбачені програ мою поглибленого вивчення інформатики, а й матеріал, не обхідний для підготовки до олімпіад, турнірів, конкурсів тощо.
Достатній досвід роботи з учнями Чернівецького міського ліцею № 1, робота з обдарованими дітьми під час підготовки до різного рівня олімпіад з інформатики дають підстави сподіва тися, що даний навчальний посібник буде корисним учителям, тренерам та їхнім учням.
Тетяна Караванова
З
РозділІ
9 0 1 ) 0 1 1 : 0 10
|
10 0 1 |
0 111 |
||
10 1 1 1 0 0 |
0 1 |
|||
о о о o l i o і |
||||
|
10 |
10 0 |
10 1 |
|
В 01 |
10 10 0 1 |
|||
0 |
0 1 1 1 0 11 |
|||
10 11 |
о |
о і |
||
о с а |
|
і |
||
. 1 |
0 |
|
|
і |
АЛГОРИТМИ ДЛЯ РОБОТИ З ДОВГИМИ ЧИСЛАМИ
Дані алгоритми мають коротку і влучну назву - довга ариф метика. Про що йдеться? Ми вже розглядали питання обмеже ності значень різних типів даних і наводили приклад обчислен ня значень га! для га > 7 у разі, коли результат описано як цілу змінну. При цьому матимемо неправильну відповідь. І все це тому, що значення 8! = 40 320, а тип integer має верхню межу значень 32 767. Під час обчислення відповіді для га = 8 за допо могою простенької програми
program factorial; varf, і, n: integer;
begin read(n); f: = 1;
for і := 1 to n do f =f * j-
і . і i,
writeln(f)
end;
отримаємо результат -25 216, який демонструє описану ситуацію. Отже, ми вийшли за межу значень даного типу і не можемо отри мати правильний результат. Така ситуація може трапитися не ли ше під час обчислення факторіала, а, наприклад, при спробах отри мати значення аь при цілих, але великих значеннях аргументів.
Вихід із цієї ситуації є, якщо подати число у вигляді масиву окремих його цифр. Алгоритми довгої арифметики передба чають поцифрову обробку заданих чисел, а тому є циклічними. Оскільки йдеться про арифметику, то й алгоритми, які реалізу ються над довгими числами, - це алгоритми додавання, віднімання, множення та ділення. І ще одна умова - розгляда тимемо лише цілочислову арифметику.
Отже, нам потрібно буде реалізувати алгоритми виконання арифметичних дій над числами, що подані у вигляді масивів цифр. Розглядаючи системи числення, ми раніше реалізовува ли ці алгоритми для систем числення з основами Р. Нагадаємо їх та дещо модифікуємо.
Розглянемо ті арифметичні дії, які найчастіше трапляються в задачах, а саме: додавання, віднімання і множення.
Додавання довгих цілих чисел
Нехай задано масиви At, Вр і = 1, 2, ..., п, елементами яких є цифри 10-ї системи числення. Розробимо алгоритм додавання цих двох довгих чисел. Для цього необхідно порозрядно дода вати цифри двох чисел і контролювати отриманий результат: якщо він менший за 10, то це і є наступна цифра числа-ре- зультату; якщо ні, то необхідно відокремити цифри одиниць і десятків отриманого результату і продовжити додавання на ступних розрядів.
Запишемо у словесній формі алгоритм додавання у стовпчик двох десяткових чисел.
1.Нехай п - кількість цифр у першому числі, а т - у друго му. Тоді визначимо k = max(n, т).
2.Визначити і := 1, с := 0 (с - кількість десятків у додаванні попереднього розряду).
3.Нехай аі - і-та цифра першого доданка, bt - другого, а rezi - результату. Визначити с := at + bt + с.
4.Якщо с < 10, тоді визначити rezi := с і перейти до п. 6.
5.Якщо с > 10, тоді визначити значення і-го розряду числа-
результату як rezt := <кількість одиниць числа с> , а значення, яке необхідно буде додати у наступному розряді, - як с := к і л ь кість десятків числа с > .
6.Якщо і < k, то і := і + 1 та перейти до п. 3.
7.Якщо с > 0, то k := k + 1, rezk := с, що означатиме збіль шення розрядності числа-результату.
8.Вивести елементи масиву гаг.
Реалізуємо фрагмент цього алгоритму (п. 1-6) у вигляді про цедури:
procedure add(var a: mas; b: mas; var k: word); var i: word;
begin
if n > m t h e n k := n e l s e k := m; {Визначення максимальної довжини двох чисел.}
с:=0;
for і := 1 to k do
b e g i n |
|
{Визначення суми цифр поточного розряду} |
|
С := а[і] + Ь[і] + с; |
|
{і десятків попереднього.} |
|
а [І] := С m o d 10; |
{Кількість одиниць є поточною цифрою результату,} |
||
С := c d i v 10 {а кількість десятків запам'ятаємо для наступного додавання.} |
|||
e n d ; |
|
|
{Якщо після останнього} |
if с <> 0 then begin inc(k); a[k] := c end; |
{додавання кількість} |
||
e n d ; |
{десятків не нульова, то збільшуємо розрядність числа-результату.} |
||
5