Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4 основи програмування книга.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.77 Mб
Скачать

1.6. Цілі числа

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

Арифметичні операції:

a + b – операція додавання

a - b – операція віднімання,

- b – операція «мінус»;

a*b – операція множення,

a div b – операція обчислення неповної частки,

a mod b – операція обчислення залишку.

Логічні операції:

a > b - операція «більше»

a < b - операція «менше»

a <= b - операція «менше або дорівнює»

a >= b - операція «більше або дорівнює»

a = b - операція «дорівнює»

a <> b - операція «не дорівнює»

Арифметичні операції додавання, віднімання і «мінус» називають адитивними, а операції множення, обчислення неповної частки і залишку – мультиплікативними.

Ми будемо вважати, що операції div і mod правильно інтерпретуються тільки тоді, коли обидва операнди – натуральні числа. Для цих операцій справедливе співвідношення

A = B * (A div B) + A mod B.

причому

A div B >= 0, 0 <= A mod B < B.

Це означає, що будь-яке натуральне число A можна розділити на інше натуральне число B із залишком, причому неповна частка невідє’мна, а залишок може приймати значення 0, 1, ..., B-1.

Наприклад, якщо A = 56, B = 9, то A div B = 6, A mod B = 2, і 56 = 9*6 + 2.

У наступній задачі ми використовуємо операції div і mod для того, щоб виділити цифри числа.

Задача 1.1 Скласти алгоритм, що переставляє місцями старшу і молодшу цифри даного тризначного десяткового числа АВС, тобто будує число СВА.

Рішення.

Позначимо через А, В і С – відповідно старшу, середню і молодшу цифри вхідного числа АВС, а через АВ – двозначне число, отримане з АВС відкиданням останньої цифри. Тоді

C = ABC mod 10, AB = ABC div 10.

Ми «розщепили» число на молодшу цифру і число, складене зі старших цифр. З числом АВ робимо те ж саме:

B = AB mod 10, A = AB div 10.

Залишилося „зібрати” число CBA з його цифр A, B, C:

CBA = 100*C + 10*B + A.

Алгоритм Переверни число;

Вхід

ABC : Натуральне число;

Вихід

ВСА : Ціле число;

Допоміжні величини

A, B, C, AB: Цілі числа;

Початок

Обчислити C = ABC mod 10;

Обчислити AB = ABC div 10;

Обчислити B = AB mod 10;

Обчислити A = AB div 10;

Обчислити CBA = 100*C + 10*B + A

Кінець.

Задача 1.2 Банкомат заряджений купюрами номіналами 100, 50, 20, 10, 5, 2, 1. Скласти алгоритм, що визначає, скільки купюр кожного номіналу потрібно, щоб видати суму в N грошових одиниць. Ваш алгоритм повинен витрачати при цьому найменшу можливу кількість купюр.

Рішення.

Дано: натуральне число N. Позначимо через K100 кількість сотенних купюр, K50 – кількість полтин, і т.д. Наш алгоритм буде подібним жадібній людині: на кожному кроці він буде визначати і віднімати із суми максимально можливу кількість купюр даного номіналу, починаючи із самих великих.

У задачах програмування дуже часто потрібно знайти оптимальне рішення. «Жадібні» алгоритми прагнуть на кожному кроці знайти «максимальну частину» такого рішення. Ця стратегія часто, хоча далеко не завжди, приводить до оптимальних рішень.

Алгоритм Банкомат;

Вхід

N: Натуральне число;

Вихід

K100, K50, K20, K10, K5, K2, K1: Цілі числа;

Початок

Обчислити K100 = N div 100; {Кількість сотенних}

Обчислити N = N mod 100; {Залишок N < 100}

Обчислити K50 = N div 50; {Кількість півсотень}

Обчислити N = N mod 50; {Залишок N < 50}

Обчислити K20 = N div 20; {Кількість двадцяток}

Обчислити N = N mod 20; {Залишок N < 20}

Обчислити K10 = N div 10; {Кількість десяток}

Обчислити N = N mod 10; {Залишок N < 10}

Обчислити K5 = N div 5; {Кількість п'ятірок}

Обчислити N = N mod 5; {Залишок N < 5}

Обчислити K2 = N div 2; {Кількість двійок}

Обчислити K1 = N mod 2 {Залишилося одиничок < 2}

Кінець.

Задача 1.3 Скласти алгоритм, що обчислює цілі коефіцієнти А, B, C квадратного рівняння Ах2 + Вx + С = 0 за його раціональними коренями х1 = n1 / m1, x2 = n2 / m2

Рішення.

Дано: цілі числа n1, m1, n2, m2. Потрібно знайти цілі числа А, B, С. Зв'язок між коренями і коефіцієнтами квадратного рівняння встановлює теорема Вієта: якщо x1 і x2 – корені приведеного квадратного рівняння x2 + px + q = 0, то x1 + x2 = -p, x1*x2 = q. Тому

n1/m1 + n2/m2 = - B/А , n1/m1 * n2/m2 = C/А.

Звідси (n1*m2+n2*m1)/(m1*m2) = - B/А (n1*n2)/(m1*m2) = C/А.

Прирівнюємо чисельники і знаменники дробів у цих рівностях:

A = m1*m2, B = - (n1*m2+n2*m1), C = n1*n2.

Алгоритм Теорема Вiєта;

Вхід

m1, m2, n1, n2: цілі числа;

Вихід

А, B, C: цілі числа;

Початок

Обчислити A = m1*m2;

Обчислити B = -(n1*m2 + n2*m1);

Обчислити C = n1*n2

Кінець.

Програміст повинен знати ту предметну область, задачу якої він вирішує. Метод рішення потрібно шукати саме там.