/C03033 - Liệt kê N số nguyên tố đầu tiên
<Problem>
https://code.ptit.edu.vn/student/question/C03003/*
Nếu N < 5 -> Số nguyên tố là 2 và 3
Nếu N >= 5 -> Số nguyên tố nếu có sẽ luôn có dạng 6k + 1 và 6k - 1
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
int n;
int cnt = 0;
bool isPrime(int n) {
if (n == 2 || n == 3) return true;
if (n < 2 || n % 2 == 0 || n % 3 == 0) return false;
int k = -1;
do {
k += 6;
if (n % k == 0 || n % (k + 2) == 0) break;
} while (k <= trunc(sqrt(n)));
return (k > trunc(sqrt(n)));
}
void check(int p) {
if (cnt == n) return;
if (isPrime(p)) {
cnt++;
printf("%d\n", p);
}
}
int main() {
scanf("%d", &n);
int p = 2;
while (cnt < n) {
check(p);
if (p >= 5) check(p + 2);
p += (p >= 5) ? 6 : 1;
}
return 0;
}