给定一个数num,求1到n之内的所有素数有多少并输出,并且任意给定一个介于1到num的数快速判断其是不是素数。
普通版本:
int prime[MAXN];
bool mark[MAXN];
int get_prime(int num)
{
memset(mark, true, sizeof(mark));
memset(prime, 0, sizeof(prime));
int index = 0;
for(int i = 2; i <= num; ++i)
{
if(mark[i])
{
prime[++index] = i;
}
for(int j = 2; j*i <= num; ++j)
{
mark[i*j] = false;
}
}
return index;
}
高效版本:
int prime[MAXN];
bool mark[MAXN];
int get_prime(int num)
{
memset(prime, 0, sizeof(prime));
memset(mark, true, sizeof(mark));
int index = 0;
for(int i = 2; i <= num; ++i)
{
if(mark[i])
prime[++index] = i;
for(int j = 1; (j <= index) && (i * prime[j] <= num); ++j)
{
// 将所有小于等于num的prime的倍数全部筛掉(遍历完i的情况下)
mark[i*prime[j]] = false;
// 任何一个合数都能分解成两个素数的乘积
// i是prime[j]的倍数,同一个数只筛一次
// i可以分解成prime[j]和i/prime[j]的乘积,则随后的元素都不必重复筛选(尽管现在可能还未筛选)
// 因为在之后的I = prime[k]*(i/prime[j])是就可以把前面未筛选的元素筛选掉
if(i % prime[j] == 0)
break;
}
}
return index;
}