对于楼主的c代码可以按以下方法改进。
对于2以外的素数是奇数的子集,与偶数无关,所以 for(i=4;i<=n;i++);这句可改为 for(i=5;i<=n;i+=2);这样循环会减少很多
对于大循环,循环体的效率至关重要
x=i;z=sqrt(x);l=(int)z+1;改为 l=sqrt(i)+1;会更好,对于其他语句也有可改进的地方。
由于算法的原因,运算效率是无法达到8楼的程序的,所以8楼的代码很值得学习,斟酌。我在看8楼的代码时,感觉还是有一点缺陷的,可以做如下验证,n=2 m(预期输出)=1
n=3 m=2
n=5 m=3
n=6 m=3
n=7 m=4
n=8 m=4
当输入为素数时结果少1,n值未统计
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define n 100000000
void main()
{
int i,j,k;
char *p;
long t;
p=(char*)malloc(n*sizeof(char));
t=clock();
for(i=0;i<n;i++)p[i]=1;
for(i=2,k=0;i<=n;i++)//不能少一个
{
if(p[i-1])//代表数据的位序值与记录能否被整除的数组的下标有1的差值
{
for(j=i+i;j<=n;j+=i)p[j-1]=0;
k++;
}
}
printf("共查到%d个素数,用时:%f 秒\n",k,(float)(clock()-t)/1000);
free(p);
}
[此贴子已经被作者于2016-4-23 19:35编辑过]