Задача с простыми числами - VBA

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

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

Добрый вечер! Решил поступить в школу программистов Head Hunter, а там при заполнении анкеты дано 5 задач. Не могу эту решить. В универе проходил VBA, поэтому обратился сюда. Определим функцию P(n,k) следующим образом: P(n,k) = 1, если n может быть представлено в виде суммы k простых чисел (простые числа в записи могут повторяться, 1 не является простым числом) и P(n,k) = 0 в обратном случае. К примеру, P(10,2) = 1, т.к. 10 может быть представлено в виде суммы 3 + 7 или 5 + 5, а P(11,2) = 0, так как никакие два простых числа не могут дать в сумме 11. Определим функцию S(n) как сумму значений функции P(i,k) для всех i и k, таких что 1≤i≤n, 1≤k≤n. Таким образом, S(2) = P(1,1) + P(2,1) + P(1,2) + P(2,2) = 1, S(10) = 20, S(1000) = 248838. Найдите S(10992). Перебирать я так понимаю не имеет смысла - слишком громоздко. Решил методом исключения действовать. Результат не сходится уже для 1000. Что-то упустил. Правильное ли направление поиска решения или нет? Это юзерформа.
Листинг программы
  1. Private Sub CommandButton1_Click()
  2. n = TextBox1
  3. s = 0
  4. p = 0
  5. For i = 1 To n
  6. For j = 1 To n
  7. If i < j * 2 Then p = 0 Else p = 1
  8. If i Mod 2 = 0 And j = 1 Then p = 0
  9. s = s + p
  10. Next j
  11. Next i
  12. TextBox1 = s
  13. End Sub

Решение задачи: «Задача с простыми числами»

textual
Листинг программы
  1. Sub www()
  2.     Dim i As Long, j As Long, k As Long, n As Long, l As Long
  3.     Dim b(1 To 1334) As Long, s As Long, t As Single
  4.     n = 10992 '1000
  5.    t = Timer
  6.     'заполняем массив b() простыми числами
  7.    b(1) = 2 'первое простое число - 2
  8.    b(2) = 3
  9.     k = 2 'счетчик простых чисел
  10.    For i = 5 To n Step 2 'вычисляем все простые числа до n, перебираем нечетные числа
  11.    For j = 2 To k 'проверку деления на 2 исключаем
  12.        If i Mod b(j) = 0 Then Exit For
  13.         If b(j) * b(j) > i Then
  14.             k = k + 1 'увеличиваем счетчик простых чисел
  15.            b(k) = i 'запоминаем простое число
  16.            Exit For
  17.         End If
  18.     Next j, i
  19.     'вычисляем количество вариантов перебором
  20.    ReDim p(n, n \ 2) As Boolean
  21.     p(0, 0) = True
  22.     For l = 1 To n \ 2
  23.       For i = 1 To k
  24.         For j = b(i) + (l - 1) * 2 To n
  25.             If Not p(j, l) Then
  26.                 If p(j - b(i), l - 1) Then
  27.                     s = s + 1
  28.                     p(j, l) = True
  29.                 End If
  30.             End If
  31.     Next j, i, l
  32.     Debug.Print s, Timer - t
  33. End Sub

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


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

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

9   голосов , оценка 4.333 из 5

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

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

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