Написал на C++ программу которая при вводе числа (от 0 до 1010), выводит 1, если это число простое, и 0, если оно составное. Функцию IsPrime
реализовать надо было обязательно.
Программа работает, но проблема в том, что в 2 из 9 тестов нарушает предел времени 1 секунду. Как упростить программу, чтобы она не нарушала предел времени?
Код прилагаю:
#include <iostream>
using namespace std;
bool IsPrime(long long a)
{
bool z=1;
int i;
bool isPrimess = true;
i=2;
while(i <= a / 2)
{
if(a % i == 0)
{
isPrimess = false;
break;
}
i++;
}
if (!isPrimess){z=0;
return z;}
}
int main()
{
long long int a;
cin>>a;
if(a==0 || a==1)
{
cout<<"0"<<endl;
}
else{
cout<<IsPrime(a)<<endl;
}
return 0;
}
Вот такой тупой вариант должен вложиться в нужное время:
bool IsPrime(int num)
{
if (num < 2) return false;
if (num == 2) return true;
if (num%2 == 0) return false;
for (int i = 3; i*i <= num; i+=2)
{
if (num % i == 0) return false;
}
return true;
}
А вообще - здесь столько раз разбиралась эта и похожие задачи, что не найти просто сложно... Например , вот по такому запросу.
Простые модификации - ограничить диапазон проверки корнем из числа и проверять только делители вида 6*k-1
и 6*k-1
(конечно, помимо 2 и 3).
Более эффективные алгоритмы потребуют уже применения более серьезной математики
И неужели тест на время должна проходить программа с проверкой простоты одного числа?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Описать два базовых класса с защищен переменной типа char (в Первом - фамилия, в другом - им "я)В Первому из них описать функцию записи фамилии...
Что Скотт Майерс подразумевает под "Интерфейсами шаблонов" в своей книге "Эффективное использование C++55 верных советов улучшить структуру...
Говорят, что удаление ненужных включений ускоряет сборку проектаЯ решил проверить это на простом примере