素数算法
1、简单的素数算法
int IsPrime(int num)//最简单的素数求法
{
int i;
for (i=2; i<=(int)sqrt(num); i++)
{
if (0 == num%i)
{
return 0;
}
}
return 1;
}
2、筛素数算法
unsigned char flag[MAX];//flag中元素0代表是素数
int prime[MAX/3];
void filterPrime(int num, int *pi)
{
int i, j;
//int pi = 0;
memset(flag, 0, MAX);
for (i=2; i<=num; i++)
{
if (!flag[i])
{
prime[(*pi)++] = i;
for (j=i; j<num; j += i)
{
flag[j] = 1;
}
}
}
}
普通筛素数法,0到num之间的素数,从2开始将2的倍数去掉,再将3的倍数去掉...(关键点:去掉素数的倍数)
但是这个算法有一个浪费时间的地方就是很多合数会被重复操作其标志flag重复置一。
3、改进的筛素数法
void improveFilterPrime(int num)
{
int i, j;
int pi = 0;
memset(flag, 0, MAX);//flag值为0表示为素数
for (i=2; i<=num; i++)
{
if (!flag[i])
{
prime[pi++] = i;
}
for (j=0; j<pi && i*prime[j]<num; j++)
{
flag[i * prime[j]] = 1;
if (0 == i % prime[j])/*确保每个合数只被筛除一次*/
{
break;
}
}
}
}
改进的筛素数法,i从2开始到num,找出素数,并存入素数数组中,并将i值与素数表中的素数相乘,将乘积对应的flag置一,并判断与i值相乘的素数prime[j]是否是i的因子,若是则break跳出循环,对i+1进行同样的操作。