怎样编写求素数的程序,最小的素数是2,高手指点指点
线性筛素数法
#include <stdio.h>
#define N 10000
int n,i,j,ps,pr[N];
bool b[N];
int main()
{
scanf("%d",&n);
for(i=2;i<=n;i++)
{
if(!b[i]) pr[++ps] = i; // 如果没有被筛除,说明该数为素数,加入素数列表
for(j=1;j<=ps&&i*pr[j]<=n;j++)
{
b[i*pr[j]] = 1; // 筛除当前数与已知素数的乘积
if(i%pr[j]==0) break;
// 去除重复,保证时间复杂度(不加上这一句的话答案也正确,但是数据较大时时间延长了几倍)
// 这么做的原因就是,根据算术基本定理,
// 合数可以分解成若干不同质因数之积,那么筛除一个合数的方法就有多种,也就是会带来重复计算
// 所以考虑让每个合数只被最小的那一个质因数筛除
// 那么,如果i存在质因数pr[j],则大于pr[j]的质数不是i*pr[j]的最小质因数(因为已经有更小的质因数pr[j])
// 所以这个break可以减少冗余,从而达到时间复杂度上的保证
}
}
for(i=1;i<=ps;i++) printf("%d ",pr[i]);
// 最终2~n中素数存在pr数组中
return 0;
}
先明确这个定义 只能被自身和1整除的正整数是素数,1不是素数,2是最小的素数. 求素数进行的操作也就是判断是不是素数的问题
用的比较多的方式是让n按序被2~sqrt(n)之间的数除,如果不能被这区间的任意一个整数整除,则n为素数。
题目:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 2.程序源代码: #i nclude "math.h" main()
{
int m,i,k,h=0,leap=1; printf("\n");
for(m=101;m<=200;m++) { k=sqrt(m+1);
for(i=2;i<=k;i++) if(m%i==0)
{leap=0;break;} if(leap) {printf("%-4d",m);h++; if(h%10==0) printf("\n"); } leap=1; }
printf("\nThe total is %d",h);
}