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

1.2.3. Разложение на простые множители

Необходимо натуральное число разложить на произведение простых натуральных чисел.

Рассмотрим следующий алгоритм разложения натурального числа a на простые множители:

1. I=2. N=0.

2. Если a не делится без остатка на I, то перейти на пункт 5).

3. N=N+1. Запомнить N-ный множитель I, в массиве masmn. Уменьшить a в I раз (a = a\I). Если a>1 перейти на 2).

4. Если a=1, то перейти на пункт 6).

5. I=I+1. Перейти на пункт 2).

6. Вывести запомненный массив множителей - masmn.

Ниже приведена подпрограмма РазложитьНаМножители, реализующая данный алгоритм.

Sub РазложитьНаМножители(ByVal a As Long, masmn() As Long, n As Long)

Dim c As Long

c = 2: n = 0 ' Пункт 1)

Do ' Бесконечный цикл

' Если остаток от деления a на c =0, то c является множителем

2: If (a Mod c) = 0 Then

' Получили очередной простой множитель. Запоминаем

' его в массиве masmn. Пункт 2)

n = n + 1: masmn(n) = c

a = a \ c ' Уменьшаем a в c раз

Else

c = c + 1 ' Переходим к следующему числу. Пункт 5)

End If

If a > 1 Then GoTo 2

If a = 1 Then Exit Do

Loop

End Sub

Для отладки подпрограммы, напишем основную программу testМножитель(). В этой программе, при помощи операторы присваивания переменной a, задаем некоторое значение, создаем динамический массив Masmn, максимально возможной размерности (когда все множители равны 2), вызываем подпрограмму РазложитьНаМножители и выводим результаты работы подпрограммы.

Sub testМножитель()

Dim a As Long, masmn() As Long, n As Long

a = 1024*15

ReDim masmn(Int(Log(a) / Log(2)))

Call РазложитьНаМножители(a, masmn, n)

Debug.Print a; "=";

For i = 1 To n - 1

Debug.Print masmn(i); "*";

Next i

Debug.Print masmn(i)

End Sub

Результаты работы тестовой программы:

15360 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 3 * 5.

1.2.4. Вывод календаря

В некоторых задачах необходимо вывести календарь на несколько месяцев для введенного с клавиатуры года. Рассмотрим две задачи на эту тему.

1. Вывести в ячейки рабочего листа календарь на указанный месяц, указанного года.

Sub КалендарьНаМесяц()

Dim Ye As Integer, nMonth As Integer

Dim dayM As Integer, nameMonth, nameDay, numbDay

nameMonth = Array("Январь", "Февраль", "Март", "Апрель", "Май","Июнь",_

"Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь")

nameDay = Array("Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс")

Количество дней в месяце

numbDay = Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)

Ye = Val(InputBox("Введите год"))

nMonth = Val(InputBox("Введите номер месяца"))

If (Ye Mod 4) = 0 Then numbDay(2) = 29 ' Число дней в феврале

Sheets("Лист1").Select: Cells.Clear

Cells(1, 1) = "Календарь на " + nameMonth(nMonth) + _

" " + Str(Ye) + " года"

Dim Dat1 As Date, day1 As Integer

' Генерация даты первого дня месяца

Dat1 = CDate("1/" + Str(nMonth) + "/" + Str(Ye))

' Функция, возвращающая номер дня. Константа vbMonday 'определяет, что первым днем недели считать понедельник

day1 = Weekday(Dat1, vbMonday) ' Номер первого дня недели месяца

Dim i As Integer, j As Integer, k As Integer

For i = 1 To 7 'Обход по всем дням недели

Cells(i + 1, 1) = nameDay(i) ‘ Вывод дня недели

For j = 1 To 6 ‘ До 6 столбцов на однин месяц

k = i + 1 - day1 + (j - 1) * 7 ‘

If k > 0 And k <= numbDay(nMonth) Then Cells(i + 1, j + 1) = k

Next j, i

End Sub

2. Вывести в ячейки рабочего листа календарь на первый квартал, указанного года.

Sub КалендарьНаПервыйКвартал()

Dim Ye As Integer, nMonth As Integer

Dim dayM As Integer, nameMonth, nameDay, numbDay

nameMonth = Array("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", _ "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь")

nameDay = Array("Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс")

' Количество дней в месяце

numbDay = Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)

Ye = Val(InputBox("Введите год"))

If (Ye Mod 4) = 0 Then numbDay(2) = 29 ' Число дней в феврале

Sheets("Лист1").Select: Cells.Clear

Cells(1, 1) = "Календарь на первый квартал " + Str(Ye) + " года"

Dim Dat1 As Date, day1 As Integer

Dim i As Integer, j As Integer, k As Integer

For nMonth = 1 To 3

Dat1 = CDate("1/" + Str(nMonth) + "/" + Str(Ye))

day1 = Weekday(Dat1, vbMonday)

Cells(2, (nMonth - 1) * 6 + 2) = nameMonth(nMonth)

For i = 1 To 7 'Обход по всем дням недели

If nMonth = 1 Then Cells(i + 2, 1) = nameDay(i) ' Вывод дня недели

For j = 1 To 6 ' До 6 столбцов на однин месяц

k = i + 1 - day1 + (j - 1) * 7 '

If k > 0 And k <= numbDay(nMonth) Then _

Cells(i + 2, (nMonth - 1) * 6 + j + 1) = k

Next j, i, nMonth

End