質數篩選
最終算法模板,比賽就寫這個!!
int prime[100010];
void Prime(){
for (int i = 2; i <= 1000000; i++) {
prime[i] = true;
}
for (int i = 1; i * i <= 1000000; i++) {
if (prime[i]) {
for (int j = i * i; j <= 1000000; j += i) {
prime[j] = false;
}
}
}
}
或者寫下面這個:線性篩
#define SIZE 1000000
int main()
{
int check[SIZE] = {0};//元素值為0代表是素數
int prime[SIZE] = {0};
int pos=0;
int flag;
for (int i = 2 ; i < SIZE ; i++)
{
if (!check[i])//如果是素數
prime[pos++] = i;
for (int j = 0 ; j < pos && i*prime[j] < SIZE ; j++)
{
check[i*prime[j]] = 1;//篩掉
//標注一
if (i % prime[j] == 0)
break;
}
}
printf("%.2f", (double)clock()/CLOCKS_PER_SEC);
return 0;
}
下面是具體解釋,可以不看,比賽套上面模板即可!!!

###如何判斷一個數是不是質數?簡單方法一:

int is_prime(int n) {
for (int i = 2; i * i <= n; ++i) {
if (n % i == 0) {
return 0; // 不是質數
}
}
return 1; // 是質數
}
##素數篩選算法:

####算法一:時間復雜度---- O(nlogn)

for (int i = 2; i <= n; ++i) {
is_prime[i] = 1;
}
for (int i = 2; i <= n; ++i) {
for (int j = i * 2; j <= n; j += i) {
is_prime[j] = 0;
}
}
####算法二優化:

for (int i = 2; i <= n; ++i) {
is_prime[i] = 1;
}
for (int i = 2; i * i <= n; ++i) {
if (is_prime[i]) {
for (int j = i * i; j <= n; j +=i) {
is_prime[j] = 0;
}
}
}