Сьогодні | Разом | |
Відвідувань | 452 | 5307156 |
Авторізацій | 66 | 426693 |
Користувачів | 39 | 2656 |
35. Простые числа
count := 0; for d := 1 to n do if n mod d = 0 then inc(count); if count = 2 then <Число n простое> else <Число n не простое>Ка видим все просто!
36. Улучшение алгоритма проверки простого числа
count := 0; for d := 2 to n div 2 do if n mod d = 0 then inc(count); if count = 0 then <Число n простое> else <Число n не простое>И если делителей не нашлось в указанном диапазоне значений делителя, то исходное число является простым.
37. Дальнейшее улучшение алгоритма проверки простого числа
d := 2; count := 0; while (count = 0) and (d <= n div 2) do if n mod d = 0 then inc(count) else inc(d); if count = 0 then <Число n простое> else <Число n не простое>Это уже что-то! Наш алгоритм достаточно быстро проверяет, является ли число простым, так как большая часть чисел не простые, но если так встречается большое простое число, то проверка идет до конца и значительно долго!
38. Почти финальный алгоритм проверки простого числа
d := 2; count := 0; while (count = 0) and (d <= sqrt(n)) do if n mod d = 0 then inc(count) else inc(d); if count = 0 then <Число n простое> else <Число n не простое>Как и в предыдущих случаях мы предполагали, что исходное число больше единицы. Мы пришли практически к совершенному алгоритму проверки простого числа, который выполняет свою работу за приемлемое время. Например, если исходное число равно 1 млрд, то за не более чем 1000 итераций мы может с уверенностью сказать простое ли исходное число или нет!
39. Финал
d := 2; flag := (n > 1); while (flag) and (d * d <= n) do begin f := n mod d <> 0; inc(d); end; if flag then <Число n простое> else <Число n не простое>Или на C/C++
int d = 2; bool flag = n > 1; while (flag && d * d <= n) f = n % d++ != 0; if (flag) <Число n простое> else <Число n не простое>Мы потрудились на славу! Создан алгоритм, который за приемлемое время проверяет является ли заданное число простым или нет!
40. Количество делителей
d := 2; flag := (n > 1); count := 0; while (flag) and (d * d <= n) do begin count := count + byte(n mod d = 0); inc(d); end;Мы нашли количество делителей заданного числа в диапазоне от двух до корня квадратного включительно! К этому числу надо прибавить единицу, так как на единицу исходное число тоже делится. Теперь определим количество делителей в диапазоне от корня квадратного до самого числа - а их столько же, сколько и в первом диапазоне, до корня квадратного!