Проверка простых чисел в C++: методы и примеры

Чтобы проверить, является ли число простым в C++, можно использовать несколько методов. Вот несколько часто используемых подходов:

Метод 1: базовое деление
В этом методе вы можете проверить, является ли число n простым, разделив его на все числа от 2 до sqrt(n). Если в результате любого из делений остаток равен 0, то число не является простым.

#include <iostream>
#include <cmath>
bool isPrime(int n) {
    if (n <= 1)
        return false;
    for (int i = 2; i <= sqrt(n); i++) {
        if (n % i == 0)
            return false;
    }

    return true;
}
int main() {
    int number;
    std::cout << "Enter a number: ";
    std::cin >> number;
    if (isPrime(number))
        std::cout << number << " is a prime number.";
    else
        std::cout << number << " is not a prime number.";

    return 0;
}

Метод 2: оптимизированное деление
Этот метод аналогичен базовому методу деления, но включает в себя несколько оптимизаций. Он проверяет делимость только нечетных чисел и пропускает четные числа больше 2.

#include <iostream>
#include <cmath>
bool isPrime(int n) {
    if (n <= 1)
        return false;
    if (n == 2)
        return true;
    if (n % 2 == 0)
        return false;
    for (int i = 3; i <= sqrt(n); i += 2) {
        if (n % i == 0)
            return false;
    }
    return true;
}
int main() {
    int number;
    std::cout << "Enter a number: ";
    std::cin >> number;
    if (isPrime(number))
        std::cout << number << " is a prime number.";
    else
        std::cout << number << " is not a prime number.";

    return 0;
}

Метод 3: Решето Эратосфена
Решето Эратосфена — это эффективный алгоритм для генерации всех простых чисел до заданного предела. Он помечает кратные каждому простому числу составные, оставляя простые числа позади.

#include <iostream>
#include <vector>
void sieveOfEratosthenes(int n) {
    std::vector<bool> primes(n + 1, true);
    for (int p = 2; p * p <= n; p++) {
        if (primes[p]) {
            for (int i = p * p; i <= n; i += p) {
                primes[i] = false;
            }
        }
    }
    std::cout << "Prime numbers up to " << n << " are: ";
    for (int i = 2; i <= n; i++) {
        if (primes[i])
            std::cout << i << " ";
    }
}
int main() {
    int limit;
    std::cout << "Enter a limit: ";
    std::cin >> limit;
    sieveOfEratosthenes(limit);
    return 0;
}