Advertisement
Guest User

Untitled

a guest
Feb 5th, 2014
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 5.35 KB | None | 0 0
  1. ╓──────────────────────────────────────────╖
  2. ║     Структурированная программа:         ║
  3. ╙──────────────────────────────────────────╜
  4.  
  5. Alg Primes;
  6. arg x;
  7.   t = 2;
  8.   while t < x do
  9.     i = 2;
  10.     while i < t do
  11.       flag = 0;
  12.       j = 2;
  13.       while j * j < i do
  14.         if i % j = 0 then
  15.           flag = 1;
  16.         end;
  17.         j = s(j);
  18.       end;
  19.       if flag = 0 then
  20.         if t % i = 0 then
  21.           k = t / i;
  22.           flag = 0;
  23.           j = 2;
  24.           while j * j < k do
  25.             if k % j = 0 then
  26.               flag = 1;
  27.             end;
  28.             j = s(j);
  29.           end;
  30.           if flag = 0 then
  31.             res = s(res);
  32.           end;
  33.         end;
  34.       end;
  35.       i = s(i);
  36.     end;
  37.     t = s(t);
  38.   end;
  39.   Primes = res;
  40. end;
  41.  
  42.  
  43. ╓─────────────────────────────╖
  44. ║   Объяснение на словах:     ║
  45. ╙─────────────────────────────╜
  46.  
  47. Требуется программа, находящая КОЛИЧЕСТВО чисел, меньших x, являющихся
  48. произведением двух простых чисел. Принцип поиска количества таков: Для
  49. всех чисел t от 2 до x выполняется подбор такого числа i, чтобы оно было
  50. простым и при этом t / i тоже было бы простым. Тогда t = (t / i) * i, что
  51. очевидно, то i и (t / i) -- простые по условию, а следовательно t есть
  52. произведение двух простых. Если такое число найдено, счётчик res
  53. увеличивается, и поиск продолжается. После выполнения внешнего цикла --
  54. то есть перебора всех чисел-"кандидатов", результатом выполнения
  55. становится значение счётчика res, то есть результат -- количество
  56. найденных чисел, что и требуется по условию.
  57.  
  58. ╓────────────────────────────────────────────╖
  59. ║   Оценки сложности по времени и памяти:    ║
  60. ╙────────────────────────────────────────────╜
  61.  
  62. Память: Никакие переменные не принимают значений больших, чем входное x,
  63. так что формально это, очевидно, O(n), но зная теорему о простой программе
  64. и видя в тестах выражения вида i * i в качестве оценки сверху дадим ответ
  65. O(n^2) ("о-большое от эн в квадрате")
  66. Время: проверка на простоту в цикле -- это O(sqr(n)) ("о-большое от корень
  67. из эн"). В теле промежуточного цикла их две, но это не влияет на сложность
  68. (следование). Промежуточный цикл имеет линейную сложность, а его тело, как
  69. мы выяснили -- O(sqr(n)), таким образом сложность промежуточного цикла --
  70. O(n * sqr(n)) ("о-большое от эн на корень из эн"). Внешний цикл также
  71. линеен, и получаем общую сложность алгоритма по времени O(n^2*sqr(n))
  72. ("о-большое от эн квадрат на корень из эн"). (Если нигде не облажались.)
  73.  
  74. ╓─────────────────────────────────────────────────────────────╖
  75. ║   Функциональная программа, реализующая ту же функцию:      ║
  76. ╙─────────────────────────────────────────────────────────────╜
  77.                                                              
  78. Sub isPrime;
  79. arg x, i;
  80.   if i * i < x then
  81.     if x % i = 0 then
  82.       isPrime = 0;
  83.     else
  84.       isPrime = isPrime(x, s(i));
  85.     end;
  86.   else
  87.     isPrime = 1;
  88.   end;
  89. end;
  90.  
  91. Sub cyckle;
  92. arg x, i;
  93.   if i * i < x  then
  94.     if x % i = 0 then
  95.       if isPrime(i, 2) = 1 then
  96.         if isPrime(x / i, 2) = 1 then
  97.           cyckle = 1;
  98.         else
  99.           cyckle = cyckle(x, s(i));
  100.         end;
  101.       else
  102.         cyckle = cyckle(x, s(i));
  103.       end;  
  104.     else
  105.       cyckle = cyckle(x, s(i));
  106.     end;
  107.   else
  108.     cyckle = 0;
  109.   end;
  110. end;
  111.  
  112. Sub doIt;
  113. arg x, t, res;
  114.   if t < x then
  115.     doIt = doIt(x, s(t), res + cyckle(t, 2));
  116.   else
  117.     doIt = res;
  118.   end;
  119. end;
  120.  
  121. Alg Primes;
  122. arg x;
  123.   Primes = doIt(x, 2, 0);
  124. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement