首先我们先来了解一下什么是素数:
素数(又称质数):
就是除了1和它本身,没有其他因子的整数。
注:1既不是素数,也不是合数。
其实判断一个数是不是素数也非常简单,zhi'直接看他有几个因子就行了,一个fou循环就结束了,那么如果我让你找出100以内的素数,你怎么找,你首先会想到的是,那还不简单吗?两个fou循环就够了,那么如果我让你求1e5以内的素数呢你在用两个fou循环时间都太长了吧。所以呢在这里我教你一种复杂度比较低的算法。
我们假如要求1—100的素数;
首先我们知道1不知素数,然后从2开始,2不是素数,试想一下,如果2是素数那么4,6,8,10还会不会是素数,其实2*i就都不是素数了,也就是说假如我们找到了一个素数,那么我们j就可以找到多个不是素数的数,把2*i都标记成不是素数,然后我们再找下一个素数3,那么6,9,12,15.....就都不是素数了,再找下一个素数5,那么10,15,20,25,30,35也都不是素数了,这样找素数是不是和你以前的算法复杂度降低了许多,下面我们用代码实现一下素数的打表,就打1e4前的素数吧!
#include<stdio.h>
#include<string.h>
const int maxn=1e4;
int a[maxn];
int main()
{
for(int i=1;i<=maxn;i++)
a[i]=1; //先把所有的数都标记为是素数;
a[0]=0;a[1]=0;//对一些特殊的数先提前处理;
int cnt=0;//记录运行的次数
for(int i=2;i<=maxn;i++)
{
if(a[i]) //如果这个数是素数,那么找那些和他相关联的非素数;
{
for(int j=i*i;j<=maxn;j+=i)
{
cnt++;
a[j]=0;
}
//找到那些非素数并标记;
}
}
printf("%d\n",cnt);
for(int i=2;i<=maxn;i++)
{
if(a[i]) printf("%d ",i);
}
return 0;
}
如果我们用正常的方法,要运行1e8次,而这个代码只运行了16000多次,这是不是快了很多?