Прости числа

Предложение за решение на задачата за намиране на прости числа от петия междууниверситетски турнир по програмиране от 2002 година.

#include<iostream>
using namespace std;
int main()
{
// Задаване на интервал [a,b] в който се търси броя на простите числа
long long a = 100200300, b = 100300300;

// Брояч на простите числа
long long c = 0;

// Задаване на максималната допъстима грешка
long long MaxErr = ((b – a)*0.1) + 1;

// Ако началото е четно го инкрементираме, т.е. започваме от първото нечетно
if (a%2 == 0) a++;

/*
Цикъл за обхождане на числата в интервала [a,b]
Разглеждат се само нечетни, защото четните не са прости.
Което автоматично редуцира кандидатите в интервала [a,b] наполовина
count = (b – a) / 2
*/
for (long long i=a; i<=b; i+=2)

// Проверка за изключване на всички числа завършващи на 5, още се редуцира броя на кандидатите
if (i%10 != 5)
{
// Булева променлива означаваща че числото е просто (true)
bool isPrime = true;

// За текущия кандидат i се проверява дали се дели на всички числа в интервала [3, i/MaxErr]
// Това действие също редуцира кандидатите
for (long long j=3; j < i/MaxErr; j+=2)
if(i%j == 0)
{
// Ако е така, то числото не е просто.
isPrime = false;
// Следователно можем да прекъснем проверката в интервала [3, i/MaxErr], това също ускорава
break;
}

// Ако е просто инкрементираме брояча
if (isPrime) c++;
}

// Извеждане на броя на простите числа в интервала [a,b]
cout << c << endl;
return 0;
}

Условие на задачата: http://www.math.bas.bg/~nkirov/2002/5cp/prime.html

Автор: Димитър Минчев

Доктор по информатика и компютърни науки