有趣的素数

用筛选法求素数:

#include<stdio.h>

int primes(int n);   

//其中primes()函数是用来排素数的函数

int prime[100000]={0};                       

//用来存储素数的数组,初始化全部为0

int p[100000]={0};                              

//用来间接验算是不是素数的数组,初始化全部为0

int main()

{

    int number,i,size;        

//其中number为用户输入的数,size为prime()传回来的在0~number以内有多少个素数

    scanf("%d",&number);

    size=primes(number);          

//传回多少个素数

    for(i=0;i<size;i++)

    {

        printf("%d\n",prime[i]);   

//输出

    }

    return 0;

}

int primes(int n)                   

{

    int top=0,i,j;                        

//定义top为prime[]中已有的素数个数

    for(i=2;i<=n;i++)

    {

        if(!p[i])                            

//判断p[i]有没有被修改过,如果没有被修改过,就还是0,

// 则对应此时的i为素数,否则就是1,将可以判断其肯定不是素数.

    {

        prime[top++]=i;              

        //输入素数

    }

   for(j=0;j<top&&i*prime[j]<=n;j++)

    {

        p[i*prime[j]]=1;

//这个是欧拉筛选的精髓,当前的值与前面已经出现的素数相乘,其合数肯定不是素数,为其

//赋值1,这样在前面!p[i]判断的时候就可以跳过了

        if(i%prime[j]==0)

//关键 prime数组中的素数是递增的,当 i 能整除 prime[j],

//那么i*prime[j+1] 这个合数肯定被 prime[j] 乘以某个数筛掉。

               break;

// 因为i中含有prime[j], prime[j] 比 prime[j+1] 小。接下去的素数同理。所以不用筛下去了。 

            

    }

    }

    return top;

}

还有一种是遍历的方法:

#include<stdio.h>

#include<math.h>

int main()

{

 int n,m,i,k;

 scanf("%d",&n);

 for(m=2;m<=n;m++)

 {

  k=1;

  for(i=2;i<m;i++)

  {

   if(m%i==0)

   

{k=0;

    break;

    }

  }

  if(k!=0)

   printf("%d\n",m);

 }

 return 0;

}

猜你喜欢

转载自blog.csdn.net/lytwy123/article/details/80160774