【题目描述】用筛选法求100之内的素数
题目解析:
所谓“筛选法”指的是“埃拉托色尼筛法”。埃拉托色尼是古希腊的著名数学家。他采取的方法是,在一张纸上写上1~1000的全部整数,然后逐个判断它们是否素数,找出一个非素数,就把它挖掉,最后剩下的就是素数,见图6.1
![](https://img-blog.csdnimg.cn/img_convert/891629edb8e1b2b0fa1b68b76b0c87c0.jpeg)
具体做法如下:
(1)先将1挖掉(因为1不是素数)。
(2)用2除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。
(3)用3除它后面各数,把3的倍数挖掉。
(4)分别用4,5…各数作为除数除这些数以后的各数。这个过程一直进行到在除数后面的数已全被挖掉为止。例如在图6.1中找1~50的素数,要一直进行到除数为47为止。
事实上,可以简化,如果需要找1~n的素数,只须进行到除数为√n(取其整数)即可,例如对
1~50,只须进行到将√7作为除数即可。
上面的算法可表示为:
(1)挖去1;
(2)用下一个未被挖去的数p除p后面各数,把p的倍数挖掉;
(3)检查p是否小于√n的整数部分(如果n=1000,则检查p<31是否成立),如果是,
则返回(2)继续执行,否则就结束;
(4)剩下的数就是素数。
用计算机解此题,可以定义一个数组a。a[1]~a[n]分别代表1~n这n个数。如果检
查出数组a的某一元素的值是非素数,就使它变为0,最后剩下不为0的就是素数。
程序如下:
#include<stdio.h>
#include<math.h>
int main()
{
int i,j,n,a[101];
for(i=1;i<=100;i++)
a[i]=i;
a[1]=0;//先挖掉a[1]
for(i=2;i<sqrt(100);i++)
for(j=i+1;j<=100;j++)
{
if(a[i]!=0&&a[j]!=0)
if(a[j]%a[i]==0)
a[j]=0;
}
printf("\n");
for(i=2,n=0;i<=100;i++)
{
if(a[i]!=0)
{
printf("%5d",a[i]);
n++;
}
if(n==10)
{
printf("\n");
n=0;
}
}
printf("\n");
return 0;
}
【运行结果】
![](https://img-blog.csdnimg.cn/img_convert/7a5ec79601a96260bd15f19fce82df6f.png)