用筛选法求素数:
#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;
}