Придумал быстрый способ создать список простых чисел - VB

Узнай цену своей работы

Формулировка задачи:

Без использования рекурсий и сложных алгоритмов нужно только указать верхнее значение MAX
Листинг программы
  1. Public Function ProstChisla(Max&) As Long()
  2. 'Возврат списка простых чисел
  3. Dim u&, s$, s1, i&, f&
  4. u = Max * 2
  5. ReDim Byt(u - 1) As Byte
  6. ReDim PrCh&(u)
  7. s = Byt: s1 = ChrB(0)
  8. MidB$(s, 1, 1) = 1
  9. PrCh(0) = 1: i = 1
  10. While PrCh(i - 1) <= Max
  11. PrCh(i) = InStrB(PrCh(i - 1), s, s1)
  12. For f = PrCh(i) To u Step PrCh(i)
  13. MidB$(s, f, 1) = 1
  14. Next
  15. i = i + 1
  16. Wend
  17. ReDim Preserve PrCh(i - 2)
  18. ProstChisla = PrCh
  19. End Function
Вообще я сторонник очень коротких и эффективных алгоритмов если у кого есть идеи дружите со мной!

Решение задачи: «Придумал быстрый способ создать список простых чисел»

textual
Листинг программы
  1. Option Explicit
  2.  
  3. Public Function ProstChisla(Max&) As Long()
  4.     'Возврат списка простых чисел
  5.    Dim u&, s$, s1, i&, f&
  6.     u = Max * 2
  7.     ReDim Byt(u - 1) As Byte
  8.     ReDim PrCh&(Max \ 2)
  9.     s = Byt: s1 = ChrB(0)
  10.     MidB$(s, 1, 1) = 1
  11.     PrCh(0) = 1: i = 1
  12.     While PrCh(i - 1) <= Max
  13.         PrCh(i) = InStrB(PrCh(i - 1), s, s1)
  14.        
  15.         For f = PrCh(i) To u Step PrCh(i)
  16.             MidB$(s, f, 1) = 1
  17.         Next
  18.         i = i + 1
  19.     Wend
  20.     ReDim Preserve PrCh(i - 2)
  21.    
  22.     ProstChisla = PrCh
  23. End Function
  24.  
  25. Sub test()
  26. Dim a
  27. Dim b
  28. Dim t As Single
  29.  
  30. t = Timer
  31. a = ProstChisla(10000000)
  32. Debug.Print Timer - t '10,71875
  33.  
  34. t = Timer
  35. b = GetSimpleArray(10000000)
  36. Debug.Print Timer - t '1,796875
  37.  
  38. End Sub
  39.  
  40. Public Function GetSimpleArray(Max&) As Long()
  41. 'Возврат списка простых чисел
  42. Dim i&, f&, d&
  43. ReDim b(1 To Max) As Byte
  44. ReDim GSA&(1 To Max \ 2)
  45. GSA(1) = 1
  46. GSA(2) = 2
  47. i = 2
  48. d = 1
  49. Do
  50.   For f = GSA(i) To Max Step GSA(i) 'вычеркиваем кратные последнему простому
  51.    b(f) = 1
  52.   Next f
  53.  
  54.   For f = GSA(i) + d To Max Step 2 'ищем следующее простое число
  55.    If b(f) = 0 Then i = i + 1: GSA(i) = f: Exit For
  56.   Next f
  57.   d = 2
  58. Loop Until f > Max
  59. ReDim Preserve GSA(1 To i)
  60. GetSimpleArray = GSA
  61. End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы