⾸先解释下什么是筛选法?
筛选法⼜称,具体做法是:先把N个⾃然数按次序排列起来。1不是素数要排除。第⼆个数2是质数留下来,⽽把2后⾯所有能被2整除的数都划去。2后⾯第⼀个没划去的数是3,把3留下,再把3后⾯所有能被3整除的数都划去。3后⾯第⼀个没划去的数是5,把5留下,再把5后⾯所有能被5整除的数都划去。这样⼀直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。
实际思路:先将1挖走(1不是素数)然后将n以内为2的倍数筛掉,将3的倍数筛掉,将5的倍数筛掉,……,直至将最大的、小于等于sqrt(n)的那个素数的倍数筛掉后,剩下的全是素数。
运行截图:
注意:程序主要求解100以内的素数,如果求更大,请将数组空间调大
#include<stdio.h>
#include<math.h>//求平方根
int main()
{
int x;
int i, j, a[101];//定义a数组包含101个元素
scanf("%d", &x);//读入N
for (i = 1; i <= x; i++)//a[0]不用,只用a[1]~a[100]
{
a[i] = i;//使a[1]~a[100]的值为1~100
}
a[1] = 0;//先挖掉a[1]
for (i = 2; i<sqrt(x); i++)
{
for (j = i + 1; j <= x; j++)
{
if (a[i] != 0 && a[j] != 0)
if (a[j] % a[i] == 0)
a[j] = 0;//把非素数挖掉
}
}
for (i = 2; i <= x; i++)
{
if (a[i] != 0)//选出不为0的数组元素,即素数
{
printf("%d\n", a[i]);//输出素数
}
}
return 0;
}