C语言筛选法求素数

素数的定义:素数也即质数;在大于1的自然数中,除了1和他本身以外没有其他的因数,我们称之为素数。

问题:求出1-100之内的素数。

方法1,利用定义直接遍历
#include<stdio.h>
#include<math.h>
//思路:优化了j的范围而非(2-i)因为如果一个数不能被从2到其开方的数整除,其即为素数
//时间复杂度:nlog2n
void main()
{
    
    
    int i,j,k;
    for(i=1;i<=100;i++)
        {
    
    
           int k = sqrt(i);
            for(j=2;j<=k;j++)
            {
    
    
                if(i%j==0)
                    break;
            }
            if(j>k)//全部循环完后,j>k,此时就是素数;因为只要中途退出一次就有j<=k
            printf("%4d",i);
        }
}
方法二,利用数组筛选

1.原理:1-100存放于数组中,首先1不是素数,筛掉;从2开始,能被整除的,即2的倍数,都不是,筛掉;然后是3,3的倍数筛掉;然后是5,7,11…
2. 思路:设置一个容量100的数组存放1-100;初始值为0;如果不为素数,置为1表示筛掉;最后遍历数组输出值为0的元素即可。
3. 目的:本例使用数组筛选的目的是使时间复杂度将到最低,所以还有其他利用数组筛选的方法。

#include<stdio.h>
#include<math.h>
#define N 100
int main()
{
    
    
    int arr[N]={
    
    0}; //使用(索引+1)表示1-100个数
    arr[0]=1;        //1不是素数,首先筛选出来
    int i;          //i表示索引,也即元素
    for(i=2;i<=N;i++)    //第一轮:筛选掉2的倍数,
    {
    
    
       if(i%2==0)
       {
    
    
           arr[i-1] = 1;
       }
    }
    arr[1] = 0; //2是素数,因为2也是2的倍数会在第一轮中被误筛
    for(i=3;i<sqrt(N);i+=2) 
    {
    
    
        if(arr[i-1]==0) //在第一轮筛选后的元素中继续筛选
        {
    
    
            //j表示3-100的元素;
            //目的是将3的倍数置为1,依次4的倍数...
            //注意这里的初值为i*i,增量为2*i
            //之所以可以这么做,是因为3的倍数,除了本身,即乘1之外,乘2,为2的倍数(第一轮筛掉了),然后就是3乘3,所以初值为i*i;
            //同理,3*4,pass;3*5=3*3+3*2;所以增量为2*i;依次...
            for(int j=i*i;j<=N;j+=2*i)
            {
    
    
                arr[j-1]=1;
            }
        }
    }
    //打印数组
    for(i=0;i<N;i++)
    {
    
    
        if(arr[i]==0)
        {
    
    
            printf("%2d ",i+1);
        }
    }
    return 0;
}

参考来源:https://blog.csdn.net/weixin_38679924/article/details/88536802
有其他更简单的方法,欢迎指出。

猜你喜欢

转载自blog.csdn.net/qq_40589204/article/details/105242386
今日推荐