Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПрактикумПЭВМ_стр(Берков).doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
3.88 Mб
Скачать

1.2. Решение некоторых стандартных задач

Рассмотрим некоторые стандартные задачи, встречающиеся во многих вариантах.

1.2.1. Наибольший общий делитель

Дадим определения наибольшего общего делителя (НОД) и разработаем алгоритм для его вычисления.

Наибольшим общим делителем двух натуральных чисел a и b, называется третье натуральное число c, на которое делятся оба этих числа.

В учебнике для учащихся 6 классов, дан алгоритм вычисления НОД двух чисел:

1) Разложить оба числа на простые множители. Т.е. на произведение простых чисел.

2) Из множителей, входящих в разложение одного из чисел, вычеркнуть те, которые не входят в разложение другого числа.

3) Найти произведение оставшихся множителей в первом числе.

Например, найдем НОД двух чисел: 72 и 20. Для краткости будем обозначать - НОД(72, 20).

1. 72=22233, 20=225.

2. Из первого числа вычеркиваем 2, 3 и 3. Из второго числа вычеркиваем 5.

3. 22=4.

Данный алгоритм является относительно сложным для программирования. Рассмотрим один из более простых алгоритмов - алгоритм Евклида. Он основан на следующих трех свойствах НОД.

1. НОД(a, b) = НОД(b,a).

2. НОД(a, a) = 1.

3. Если a>b, то НОД(a, b) = НОД(a-b, b).

По этому алгоритму НОД(72,20) = НОД(72-20,20) = НОД(52,20) = = НОД(32,20) = НОД(12,20) = НОД(12,8) = НОД(4,8) = НОД(4,4) =4.

Напишем теперь функцию, реализующую алгоритм Евклида.

Function НОД(ByVal a As Long, ByVal b As Long) As Long

While a <> b

If a > b Then a = a - b Else b = b - a

Wend

НОД = a

End Function

Внутри данной функции формальные параметры a и b изменяются. Поэтому они должны иметь атрибуты byVal, т.е. должны передаваться по значению, а не по ссылке, как предусмотрено по умолчанию.

Напишем теперь простейшую программу для тестирования приведенной выше функции.

Sub testНОД()

Dim a As Long, b As Long, c As Long

a = 72: b = 20: c = НОД(a, b)

MsgBox ("НОД(" + Str(a) + "," + Str(b) + ")=" + Str(c))

End Sub

Программа выводит в стандартное окно: НОД(72, 20) = 4.

Если из заглавия функции убрать атрибуты параметров byVal, то вывод программы будет следующим: НОД(4, 4) = 4.

1.2.2. Наименьшее общее кратное

Наименьшим общим кратным натуральных чисел a и b называют наименьшее натуральное число, которое кратно и a и b.

В том же учебнике по математике приведен следующий алгоритм:

1. Разложить оба числа на простые множители.

2. Выписать множители, входящие в разложение одного из чисел.

3. Добавить к ним недостающие множители из разложения другого числа.

4. Найти произведение получившихся множителей.

Пример. НОК(72,20).

1) 72=22233, 20=225.

2) НОК(72,20)= 22233.

3) НОК(72,20)= 222335.

4) НОК(72,20)= 360.

Опять же, данный алгоритм относительно сложный для программирования. Учитывая, что компьютер выполняет арифметические операции в миллионы раз быстрее человека, проще применить следующий алгоритм:

1) c=max(a, b).

2) Если c без остатка делится на b, то НОК(a, b) = c и выход из функции.

3) c = c + b. Перейти на пункт 2.

4) Напишем теперь функцию НОК - реализующую предложенный алгоритм.

' НОК -- русскими буквами

Function НОК(ByVal a As Long, ByVal b As Long) As Long

Dim c As Long

If a > b Then c = a Else c = b

While (c Mod b) <> 0

c = c + a

Wend

НОК = c

End Function

Для тестирования написанной функции применим предыдущую тестирующую программу, изменив только названия программы и функции.

Sub testНОК()

Dim a As Long, b As Long, c As Long

a = 72: b = 20: c = НОК(a, b)

MsgBox ("НОК(" + Str(a) + "," + Str(b) + ")=" + Str(c))

End Sub