Запишите простые числа от 1 до 100 через кодирование VBA - PullRequest
0 голосов
/ 01 июля 2018

Я нашел приведенную ниже кодировку, но она не работает. Пожалуйста, поделитесь более подходящим кодом для написания простых чисел в VBA

Private Sub cmdPrime_Click()
Dim p, n, i As Integer
p = 1
Print “Prime Numbers are : ”
For n = 1 To 100
For i = 2 To n – 1
If n Mod i = 0 Then
p = 0
Exit For
Else
p = 1
End If

Next
If p = 1 Then
Print n
End If

Next
End Sub

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Вот немного более эффективная версия кода. Две вещи изменены:

a) Поскольку 1 не считается простым , внешний цикл начинается с 2.

б) По умолчанию число считается простым. Если оно обнаружено как не простое, дальнейшие проверки останавливаются. (В опубликованном коде значение p = 1 устанавливается для каждого раза, когда проверка обнаруживает число как простое число. Увеличение счетчика каждый раз, когда устанавливается p = 1, показывает, что оно установлено 1059 раз.)

Option Explicit
Sub generatePrimes()
    Dim flag As Boolean
    Dim n, i As Integer
    For n = 2 To 100
       flag = True
        For i = 2 To n - 1
          If n Mod i = 0 Then
             flag = False
             Exit For
          End If
        Next
        If flag = True Then
          Debug.Print i
        End If
    Next
End Sub

Выход:

 2 
 3 
 5 
 7 
 11 
 13 
 17 
 19 
 23 
 29 
 31 
 37 
 41 
 43 
 47 
 53 
 59 
 61 
 67 
 71 
 73 
 79 
 83 
 89 
 97 
0 голосов
/ 01 июля 2018

Я предполагаю, что вы переводили это с другого языка? Вы действительно должны были указать, какие линии были неудачными и что вы исследовали.

Например, простой поиск при печати в VBA сказал бы, что Print недействителен, но что Debug.Print можно использовать для «консольной» записи, т.е. записи в непосредственное окно (которое вы открываете с помощью Ctrl + G ).

“”: сейчас я не могу вспомнить правильный термин. Это типично при копировании между приложениями, поэтому будьте осторожны. Речевые метки для использования в редакторе Visual Basic должны быть "" для компиляции.

Если вы поставите Option Explicit в верхней части своего кода, это даст вам много хороших предупреждений о объявлениях переменных и их написании.

Вы можете перейти от 100 к Integer, но в этом случае нет преимуществ от Integer по сравнению с Long, поэтому использование Long безопаснее, если в будущем вы решите выйдите за пределы Integer, и тогда вы рискуете переполниться. Вам также, при достаточно высоком верхнем пределе, нужно вычленить mod.

Функция MOD возвращает ошибку, если делитель (второй аргумент в функции MOD), умноженное на 134 217 728, меньше или равно на оцениваемое число (первый аргумент в MOD функция).

Microsoft предлагает переработать как =number-(INT(number/divisor)*divisor); который, я думаю, вы могли бы заменить INT на CLng, чтобы сохранить с Longs.

Option Explicit
Private Sub cmdPrime_Click()
    Dim p As Long, n As Long, i As Long, iCounter As Long
    p = 1
    With ActiveSheet
        .Cells(iCounter + 1, 1) = "Prime Numbers are: " 'Debug.Print "Prime Numbers are: "
        For n = 2 To 100 ''< As pointed out 1 is not technically a prime btw so can start at 2
            For i = 2 To n - 1
                If n Mod i = 0 Then              ' If n - (CLng(n / i) * i) = 0 Then
                    p = 0
                    Exit For
                Else
                    p = 1
                End If
            Next
            If p = 1 Then
                iCounter = iCounter + 1
                .Cells(iCounter, 1) = n  'Debug.Print n  
            End If
        Next
    End With
End Sub

Чтобы сохранить для будущих читателей: дополнительные полезные комментарии от @ ChrisNeilsen.

Чтобы проверить, является ли n простым, вам нужно только проверить делимость с точностью до квадратного корня из n. И вам нужно только проверить делимость на ранее обнаруженные простые числа. И вы можете пропустить даже значения n.

...