首先我们来了解一下什么是素数:
质数是除1以外,只有1和其本身的因数的数,比如说2,3,5,7,11
如果我们平时没有学过是算法,基本上会用比较耗时的方法,就是从2穷举到n - 1
判定质数 —— 试除法
第一种方法
这种方法相对来说比较暴力,但是也是最容易想到的一种方法,但是对于一些数比较大的题目容易超时;
时间复杂度为O(n)
#include <stdio.h>
int main()
{
int n,c = 0;
scanf("%d",&n);
if (n == 1)
printf("no\n");
if (n == 2)
printf("yes\n");
if (n > 2)
{
for (int i = 2; i < n; i++)
{
if (n % i == 0)
c = 1;
}
if (c == 0)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
第二种方法
第二种方法就是对第一种方法的优化
n的因数是成对出现的
时间复杂度为O(sqrt(n))
#include <stdio.h>
int main()
{
int n,c = 0;
scanf("%d",&n);
if (n == 1)
printf("no\n");
if (n == 2)
printf("yes\n");
if (n > 2)
{
for (int i = 2; i * i <= n; i++)
{
if (n % i == 0)
c = 1;
}
if (c == 0)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
质数筛
从1—n算出所有质数的个数
朴素版
时间复杂度为O(nlog(n))
bool st[N];c++
int prime[N];
void get_primes(int n)
{
int num = 0;
for (int i = 2; i <= n / i; i++)
{
if (!st[i]) prime[num++] = i;
for (int j = i + i; j <= n; j += i) st[j] = true;
}
}
埃式筛法
bool st[N];
int prime[N];
void get_prime(int n)
{
int num = 0;
if (!st[N])
{
prime[num++] = i;
for (int j = i + i; j <= n; j += i) st[j] = true;
}
}
欧拉筛法
void get_prime(int n)
{
for (int i = 2; i <= n; i ++)
{
if (!st[i]) prime[num++] = i;
for (int i = 0; prime[j] <= n / i; j ++)
{
st[prime[j] * i] = true;
if (i % prime[j] == 0) break;
}
}
}