Алгоритмы → Поиск простых чисел
Так как я люблю решать различные математические задачки (
Желающие также могут поделиться своими наработками. Ссылки на другие ресурсы бросать не нужно, кто захочет, сам найдет через поисковые системы. Я любитель С++, поэтому весь синтаксис будет на нем.
Первая функция проверяет, простое ли число. Для этого нужно вызвать функцию, передав в нее число, которое нам нужно проверить на простоту.
int PrimeNumber(int number)
{
for (int i=2; i<number; i++)
{
if (number%i == 0)
{
return 0;
}
if ((i==number) || (i>sqrt(number)))
{
return 1;
}
}
return 1;
}
Вторая функция находит следующее простое число после числа, которое мы передаем в аргументах функции.
int NextPrimeNumber(int previous)
{
int temp = previous + 1;
int next = 0;
int exit = 0;
int i = 2;
while (exit == 0)
{
if (temp%i == 0 && i!=temp)
{
temp++;
i=2;
continue;
}
if ((i==temp) || (i>sqrt(temp)))
{
next = temp;
exit = 1;
}
i++;
}
return next;
}
Важно! В обеих функциях мы проверяем на остаток при делении нужного нам числа от двойки (так как на единицу оно и так будет делиться без остатка) до корня нашего числа. Это важная оптимизация нашего кода, которая позволяет работать нам с большими числами. Без нее поиск значения может значительно замедлиться.
- +9
- eReS
- 02 января 2011, 16:42
Это особенно ускорит алгоритм при больших числах т.к. будут пропускаться все большие массивы чисел
Ну пока незнаю как реализовать кратко и ясно. В будущем, надеюсь, исправлю это
Синтаксис правда больше на C# похож, но суть вроде передает. List это список, и осталось только вставить добавление очередного простого числа. Это уже по вкусу или перед return или уже при использовании функций
1. решето Эратосфена,
2. проверка делимости нечетных чисел на уже найденные простые числа (величиной до квадратного корня из тестируемого числа).
Т.е. для того что бы найти все простые числа до 1 000 000 нам необходим массив из 999 999 чисел от 2 до 1 000 000, а в случае делимости чисел массив будет состоять только из простых чисел
Или есть какая-то реализация решета не пожирающая память?
1. В решете делается упор на большое количество простых операций (сложений),
2. Во втором способе упор на небольшое количество медленных операций (деление с остатком).
Честно говоря, с битовыми массивами не работал и насколько сложно реализовать это будет не представляю, но идея передачи этой решетки в виде картинки (bitmap) достаточно интересна))
Запись единицы в i-й бит массива a, состоящего из 32-битных чисел:
Чтение не сложнее. Кстати, можно за раз проверять 32 числа на простоту, сравнивая соответствующую ячейку массива a с 0xffffffff.