做法步骤如下:
1.先将1挖掉(因为1不是素数)。
2.用2除它后面的各个数,把能被2整除的数挖掉。
3.用3除它后面的各个数,把3的倍数挖掉.
...........
当然,也不需要到最后一个数,如果需要找1~n范围内的素数,只需进行到除数为根号n(取其整数即可,
上面的算法为:
(1):挖去1;
(2):用下一个未被挖去的数(这一步很重要)p除后面个数,把p的倍数挖掉;
(3):检查p是否小于根号n,如果是,继续执行第二步;否则,结束循环
(4):剩下的数就是素数,打印出来
代码如下
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
int j = 0;
int a[101];//定义数组a包含101个元
a[0] = 0;
for (i = 1; i <= 100; i++)
{
a[i] = i;//a[1]到a[100]赋值为1~100
}
a[1] = 0;//把非素数全部赋值为0,作为标志位
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;//把不是素数的数赋值为0;
}
}
}
}
//打印2~100的素数
for (i = 2; i <= 100; i++)
{
if (a[i] != 0)
{
printf("%d ", a[i]);
}
}
return 0;
}
如果没有if (a[i] != 0 && a[j] != 0)会怎么样呢?
j=4, a[4]被赋值为0后,i=4时,j从5开始,此时a[i]=0;任何数不能对0取余。系统不会报错,系统一直进行死循环,所以我们对不是素数的数不用再进行判断了。可能有人会迷惑a[i]为啥也不等于0;因为j永远比i大,i=2时,j=4时,a[4]=0了,如果继续进行i++,此时a[i]=0,a[ j ]也不能等于0;i=2时,4,被筛选出去了,a[4]==0了,i=3时,j=4,就不用再筛选一遍了,