Online C Compiler
Открыть в компиляторе

Учебная версия на русском. Код и его вывод сохранены в исходном виде.

Простые числа на C

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

Открыть в компиляторе

Простые числа на C
Проверяйте делители до квадратного корня и правильно обрабатывайте числа меньше двух.

Простое число — целое больше единицы с двумя положительными делителями. Ноль, единица и отрицательные числа не являются простыми. У составного N хотя бы один множитель не превосходит квадратного корня.

Исключите чётные числа кроме двойки, затем проверяйте нечётные делители. Для больших положительных чисел условие divisor <= N / divisor избегает переполнения divisor * divisor. При найденном делителе остановитесь.

Проверьте 1, 2, квадрат вроде 49 и простое число. Пробное деление занимает O(sqrt(N)) времени и O(1) дополнительной памяти.

Код C

#include <stdio.h>
#include <stdbool.h>

bool is_prime_optimized(int n) {
    if (n <= 1) return false;
    if (n <= 3) return true;
    if (n % 2 == 0 || n % 3 == 0) return false;

    // Check factors 6k +/- 1 up to sqrt(n)
    for (int i = 5; (long long)i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) {
            return false;
        }
    }
    return true;
}

int main(void) {
    int test_numbers[] = {1, 2, 17, 25, 29, 49, 97, 100};
    int total = sizeof(test_numbers) / sizeof(test_numbers[0]);

    printf("--- Prime Number Verification ---\n");
    for (int i = 0; i < total; i++) {
        int val = test_numbers[i];
        printf("%3d -> %s\n", val, is_prime_optimized(val) ? "PRIME" : "NOT prime");
    }

    printf("\nPrimes between 1 and 50:\n");
    for (int i = 1; i <= 50; i++) {
        if (is_prime_optimized(i)) {
            printf("%d ", i);
        }
    }
    printf("\n");

    return 0;
}
Открыть в компиляторе

Ожидаемый вывод

--- Prime Number Verification ---
  1 -> NOT prime
  2 -> PRIME
 17 -> PRIME
 25 -> NOT prime
 29 -> PRIME
 49 -> NOT prime
 97 -> PRIME
100 -> NOT prime

Primes between 1 and 50:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 

Частые вопросы

Почему код и вывод остаются на английском?

Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.