看看我的这个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分多钟.










我目前只会传统的筛法