1.解释下什么是筛选法?
筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。
2.程序步骤:
<1> 先将1挖掉(因为1不是素数)。
<2> 用2去除它后面的各个数,把能被2整除的数挖掉,即把2的倍数挖掉。
<3> 用3去除它后面的各数,把3的倍数挖掉。
<4> 分别用5…各数作为除数去除这些数以后的各数。
3.具体应用(求100以内的素数):
基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列,把不是素数的数全部赋值为0,最后只输出不是零的数即素数。1不是素数,首先把它换为0。剩下的数中选择最小的数是素数,然后把它的倍数全部换为0。依次类推,直到结束。
1 #include<stdio.h>
2 int main()
3 {
4 int i, j,k, a[51];
5 for (i = 1; i <= 50;i++) //给数组赋值
6 {
7 a[i] = i;
8 }
9 a[1] = 0; //a[1]数组在后面模2判断错误需要在前面先赋值
10 for (j = 1; j <= 50; j++)
11 {
12 for (k = j+1; k <= 50; k++)
13 {
14 if (a[j]!=0&&a[k]!=0)
15 {
16 if (a[k] % a[j] == 0) //是把外层循环当除数不是把外层循环做被除数
17 {
18 a[k] = 0; //不是素数的赋值为0
19 }
20 }
21 }
22 }
23 for (i = 1; i <= 50; i++)
24 {
25 if (a[i] != 0) //输出素数
26 {
27 printf("%d\n", a[i]);
28 }
29
30 }
31 return 0;
32 }