Скатерть Улама представляет из себя спираль чисел натурального ряда, на которой отмечены клетки, соответствующие простым числам.
Попробуем составить скатерь Улама в Excel. При этом воспользуемся VBA.
Располагая числа по спирали
обозначим перемещения таким образом:
Попробуем составить скатерь Улама в Excel. При этом воспользуемся VBA.
Располагая числа по спирали
обозначим перемещения таким образом:
- П - вправо
- В - вверх
- Л - влево
- Н - вниз
Тогда при заполнении получаем такой ряд: П В Л Л Н Н П П П В В В Л Л Л Л Н Н Н Н П П П П П ...
Заметим, что следующее идентичное перемещение на 2 шага длиннее предыдущего (к примеру, вправо: сначала 1 раз, потом 3 раза, потом 5 и т.д.).
Это замечание и ляжет в основу алгоритма VBA.
- Public Sub Ulam()
- Dim i As Integer, tekR As Integer, tekC As Integer
- Dim limit As Integer, tekNum As Long
- Dim rCell As Range, iColor As Integer
- Cells.Clear
- Cells.ColumnWidth = 5.83
- Cells.RowHeight = 30
- tekR = 10
- tekC = 10
- limit = 1
- tekNum = 1
- Cells(tekR, tekC) = tekNum
- Do While limit < 20
- For i = 1 To limit
- tekC = tekC + 1
- tekNum = tekNum + 1
- If tekC = 0 Or tekR = 0 Then Exit Do
- Cells(tekR, tekC) = tekNum
- Next i
- For i = 1 To limit
- tekR = tekR - 1
- tekNum = tekNum + 1
- If tekC = 0 Or tekR = 0 Then Exit Do
- Cells(tekR, tekC) = tekNum
- Next i
- For i = 1 To limit + 1
- tekC = tekC - 1
- tekNum = tekNum + 1
- If tekC = 0 Or tekR = 0 Then Exit Do
- Cells(tekR, tekC) = tekNum
- Next i
- For i = 1 To limit + 1
- tekR = tekR + 1
- tekNum = tekNum + 1
- If tekC = 0 Or tekR = 0 Then Exit Do
- Cells(tekR, tekC) = tekNum
- Next i
- limit = limit + 2
- Loop
- For Each rCell In ActiveSheet.UsedRange
- tekNum = rCell.Value
- limit = Int(Sqr(rCell.Value))
- iColor = 8
- For i = 2 To limit
- If tekNum Mod i = 0 Then iColor = 0
- Next i
- rCell.Interior.ColorIndex = iColor
- If tekNum = 1 Then rCell.Interior.ColorIndex = 3
- Next
- ActiveSheet.UsedRange.Select
- ActiveWindow.Zoom = True
- Range("A1").Select
- End Sub
Немного пояснений по коду:
строки 2 - 3: i - счетчик цикла, tekR - номер строки и tekC - номер столбца ячейки (клетки) с которой работаем, limit - число шагов, tekNum - число, которое мы поместим в клетку с координатами tekR и tekC.
строки 5 - 7: удаляем всю информацию с текущего листа и делаем ячейки квадратными.
строки 8 - 12: присваиваем начальные значения.
строки 13 - 39: заполнение по спирали (стр. 14 - 19 двигаемся вправо, стр. 20 - 25 - вверх, стр. 26 - 31 - влево, 32 - 37 - вниз, после чего в стр. 38 увеличиваем шаг на 2 и пошли по новой).
строки 40 - 49: проверка простоты числа и форматирование клетки в зависимости от этого.
строки 50 - 52: выделяем нашу "скатерть" и ставим масштаб листа "по выделению".
В конечном итоге, получаем такую картину:
Такие параметры , как первое число (ведь это не обязательно 1) и размеры таблицы (параметр limit) стоит вводить через диалоговое окно.
Примечательным является то, что простые числа выстраиваются вдоль диагональных прямых.
Комментариев нет:
Отправить комментарий