感觉自己写得不太好 ,里面还有不少问题。希望路过的大佬指点一二!!!!
直接进入主题,我们要解决的问题是 求1到n范围内所有的素数。当然这个问题的难度取决n的大小。
儿童版 当n<=30的时候。(废话)不用动手脑子里面想一遍就知道有哪些素数了。
低级版 当 n<=60的时候。(废话)这时就需要自己动手写一下了。
初级版 当 n<=1e5的时候。(渐入佳境)手写就有一点难受了,最好是依靠计算器编程求这些素数。而计算机的初学者就会想到利用素数的性质来判断一个数是否是素数,及枚举这个数所有可能的因子。
最初枚举的时候枚举的是2~n-1,发现这样的枚举方法有点笨,时间复杂度也有点高,O(n*n)。
然后自然而然的想到了有一半的数不用枚举,只需要枚举2~n/2,时间复杂度也有点高,但毕竟除了一个2嘛,O(n*n/2)。
再后来想到一个合数最大的因子也不过是√n,那么这个范围又可以缩小。只需要枚举2~√n,在n比较小的时候这个时间复杂度是够的。毕竟计算机每秒能跑1e9次,(见表1)O(n*√n)。
想想这个枚举还可以优化,因为枚举的时候枚举了2,4,6,8,10…..,感觉4,6,8,10….这些东西是不用枚举的,所以这个枚举的的方法又一次得到了提高,(见表2)O(n*√n/2)。
int cnt=0;//素数的个数 for(int i=2;i<=n;i++) { int flag=0;//标记0 为素数 int xx=sqrt(i); for(int j=2;j<=xx;j++) { if(i%j==0) {
|