所谓筛选法是指“Eratosthenes筛法”,采用的方法就像拿一个“筛子”不断地筛掉一组数中非素数的数,那么剩下的就都是素数了,具体做法如下:
从1开始,先将1筛掉。(1是特殊的非素数,直接去掉即可,具体的素数定义可以参考维基百科)
然后从2开始,2是素数,2的整数倍都不是素数,都筛去。
然后3也同理,而4则是2的两倍,已经被筛去就跳过,所以下一个是5。
一直到99为止。(实际上只需要筛选到为止即可,因为<=n,已经可以筛选到n项了)
下面我们看代码
#include<stdio.h>
#include<math.h>
int is_prime(int x)//判断素数函数
{
int k = 0;
for (k = 2; k < sqrt(x); k++)
{
if (x % k == 0)
return 0;
}
return 1;
}
void print_prime_number()
{
int i = 0;
int arr[100] = { 0 };//arr[i]中放的为0表示是素数,为1表示是非素数
for (i = 2; i < 100; i++)//从2到100判断下去,是素数就把它的j倍都筛去,标记为非素数;非素数的跳过
{
if (arr[i] == 1)//如果已经被标记为非素数就不用进行下去了
continue;
if (is_prime(i) == 1)
{
int j = 1;
for (j = 2; i*j < 100; j++)
{
arr[i * j] = 1;//把是素数的那个数的n倍数都筛去
}
}
}
for (i = 2; i < 100; i++)//打印素数,打印下标即可
if (arr[i] == 0)
printf("%d ", i);
}
int main()
{
print_prime_number();
return 0;
}
实际上,可以将i的变化从(2到99)优化为(2到9)。
void print_prime_number()
{
int i = 0;
int arr[100] = { 0 };
for (i = 2; i < 10; i++)
{
if (arr[i] == 1)//如果已经被标记为不是素数就不用进行下去了
continue;
if (is_prime(i) == 1)
{
int j = 1;
for (j = 2; i*j < 100; j++)
{
arr[i * j] = 1;//把是素数的那个数的n倍数都筛去
}
}
}
for (i = 2; i < 100; i++)//打印素数
if (arr[i] == 0)
printf("%d ", i);
}