看看我的这个Erastothens有多高效.
传统的写法.程序代码:
#include <stdio.h> #include <math.h> #define cnt 50000000 int main(void) { int i; int j; int a[cnt]; for (i = 1; i <= cnt; i++) a[i] = i; for (i = 2; i < sqrt(cnt); i++) for (j = i + 1; j <= cnt; j++) { if (a[i] != 0 && a[j] != 0) if (a[j] % a[i] == 0) a[j] = 0; } /* int n = 0; for (i = 2; i <= cnt; i++) { if (a[i] != 0) { printf("%-5d", a[i]); n++; } if (n == 10) { printf("\n"); n = 0; } } printf("\n"); */ return 0; }
我的写法
程序代码:
#include <stdio.h> #define cnt 50000000 int uDel(int arry[] , int n) { int i , val; for (i = 0 ; i < n ; i++ ) { if (arry[i] == 0) continue ; else { val = arry[i] ; return val ; } } } int main(void) { int arry[cnt] ={0,0}; int i , j ; for (j = 2 ; j < cnt ; j++ ) arry[j] = j ; for (i = uDel(arry,cnt) ; i * i <= cnt ; i = uDel(arry , cnt)) { // printf("%d " , i) ; for (j = 1 ; j * i < cnt ; j++) arry[j * i] = 0 ; } /* for ( i = 0 ; i < cnt ; i++) if (arry[i] != 0 ) printf("%d " , arry[i]) ; */ return 0 ; }
注意上面 cnt 50000000 是我在unix-center上的服务器测试用的,普通的pc的内存早就超出了限制.在你机器上适当的改小.
另外,把输出语句注释掉是应为printf太耗时,这里单纯的比较算法.我在unix-center上的一台freebsd6.2系统上分别运行(数量级50000000)了两个程序,我的在2秒内完成,而传统的写法我等了2分多钟.