数组的运用:例题1:用筛选法找素数

做法步骤如下:

1.先将1挖掉(因为1不是素数)。

2.用2除它后面的各个数,把能被2整除的数挖掉。

3.用3除它后面的各个数,把3的倍数挖掉.

...........

当然,也不需要到最后一个数,如果需要找1~n范围内的素数,只需进行到除数为根号n(取其整数即可,

上面的算法为:

(1):挖去1;

(2):用下一个未被挖去的数(这一步很重要)p除后面个数,把p的倍数挖掉;

(3):检查p是否小于根号n,如果是,继续执行第二步;否则,结束循环

(4):剩下的数就是素数,打印出来

代码如下


#include
#include
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,就不用再筛选一遍了,

你可能感兴趣的:(C语言基础详解,c语言)