我最初认为复杂度是O(n ^ 3),因为内部循环转到i * i,但现在我认为复杂性是O(n ^ 2),因为" break"言。
你的想法是什么?
#include <stdio.h>
int main()
{
int i,k,l,m;
unsigned int j;
l=0;
for (i=3; i<65535;i+= 2) {
k=1;
for (j=3; j <= i*i; j += 2) {
if (j==i) continue;
if(i%j ==0) {
k=0;
break;
}
}
if (k) { l++; }
}
printf("%i\n", l);
return 0;
}
答案 0 :(得分:2)
内部循环对于素数是O(N ^ 2),对于非素数是快的(最坏情况是O(N ^ 1/2),因为你只需要搜索到sqrt(N))。
然而,素数的数量与非素数的数量相比较小。向上X的素数的近似值是:X / log(X),如reference link.
中所示因此抛出非素数是无关紧要的,有N / log(N)素数,每个内部循环需要O(N ^ 2)时间,因此总时间为O(N ^ 3 / log(N) )。
答案 1 :(得分:0)
for (j=3; j <= i*i; j += 2) {
if (j==i) continue;
if(i%j ==0) {
k=0;
break;
}
}
没有j == i
这里j = 3,5,7,9,11,13,15,17 ...... 65535。这意味着j将包含除2之外的所有素数高达65535。 让我们在这里有一个数学。 J&LT;我*我如果i是2的幂或素数,则j循环将完全执行,但我们可以忽略2的幂,因为我总是奇数。对于任何i,在某些点i = j [ O( n)复杂性]
如果我是辅音,那么i%j == 0将很快发生。正如JS1所指出的那样,j循环将通过忽略j == i。
来取n / logn总时间复杂度= O(N * 2 / logn)