#include <iostream>
#include <vector>
#include <cmath>
#include <ctime>
using namespace std;
bool isPrime1(int num) {
for (int i = 2; i < num; ++i) {
if (num % i == 0) {
return false;
}
}
return true;
}
bool isPrime2(int num) {
int cnt = sqrt(num);
for (int i = 2; i <= cnt; ++i) {
if (num % i == 0) {
return false;
}
}
return true;
}
bool isPrime3(int num) {
if (num <= 3) {
return num > 1;
}
int mod6 = num % 6;
if (mod6 != 1 && mod6 != 5) {
return false;
}
int cnt = sqrt(num);
for (int i = 5; i <= cnt; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) {
return false;
}
}
return true;
}
vector<int> getPrime1(int num) {
vector<int> prime;
if (num >= 2) prime.emplace_back(2);
if (num >= 3) prime.emplace_back(3);
for (int i = 5; i <= num; i += 6) {
prime.emplace_back(i);
if (i + 2 <= num) {
prime.emplace_back(i + 2);
}
}
return prime;
}
vector<int> getPrime2(int num) {
vector<int8_t> isprime(num + 1, 0);
int k = 2, tt = 0;
while (tt <= num) {
for(int i = 1; i <= num; i++) {
if(i % k == 0 && i != k) {
isprime[i] = 1;
}
}
for(int i = 1; i <= num; i++){
if(i > k && isprime[i] == 0) {
k=i;
break;
}
}
tt++;
}
vector<int> prime;
for (int i = 2; i <= num; ++i) {
if (isprime[i] == 0) {
prime.emplace_back(i);
}
}
return prime;
}
void test() {
srand(time(nullptr));
int n = 10;
while (n--) {
int randomNum = rand() % 0xffff + 2;
if (isPrime1(randomNum)) {
printf("isPrime1(%d): %d is prime\n\n", randomNum, randomNum);
} else {
printf("isPrime1(%d): %d isn't prime\n\n", randomNum, randomNum);
}
if (isPrime2(randomNum)) {
printf("isPrime2(%d): %d is prime\n\n", randomNum, randomNum);
} else {
printf("isPrime2(%d): %d isn't prime\n\n", randomNum, randomNum);
}
if (isPrime3(randomNum)) {
printf("isPrime3(%d): %d is prime\n\n", randomNum, randomNum);
} else {
printf("isPrime3(%d): %d isn't prime\n\n", randomNum, randomNum);
}
vector<int> prime1 = getPrime1(randomNum);
printf("getPrime1(%d): ", randomNum);
for (int p : prime1) {
cout << p << " ";
}
cout << endl << endl;
vector<int> prime2 = getPrime2(randomNum);
printf("getPrime2(%d): ", randomNum);
for (int p : prime2) {
cout << p << " ";
}
cout << endl << endl;
}
}
int main() {
test();
}