遇到一个题目,求n以内的素数个数,用一般方法超时。代码如下:测试后可以看出法(2)速度约为法1得1/3。
#include<stdio.h>
#include<time.h>
int isprime(int a){
int f=0;
if(a==2||a==3)return 1;
else{
if(a%6!=1&&a%6!=5){return 0;}
else{
for(int i=5;i*i<=a;i+=6){
if(a%i==0||a%(i+2)==0)return 0;
}
return 1;
}//法(1)
}
}
int isprime2(int a){
int f=0;
if(a==0||a==1)return 0;
else{
for(int i=2;i*i<=a;i++){
if(a%i==0){f=1;break;
}
}
if(f==0)return 1;
else return 0;
}//法(2)传统判断素数
}
int main(){
int count1=0,count2=0;
double time1,time2;
clock_t st1,st2,ed1,ed2;
st1=clock();
for(int i=2;i<1000000;i++){
if(isprime(i))count1++;
}
printf("%d\t",count1);
ed1=clock();
time1=(double)(ed1-st1)/CLOCKS_PER_SEC;
printf("n=1000000时:t = %fs\n",time1);
st2=clock();
for(int i=2;i<1000000;i++){
if(isprime2(i))count2++;
}
printf("%d\t",count2);
ed2=clock();
time2=(double)(ed2-st2)/CLOCKS_PER_SEC;
printf("n=1000000时:t = %fs\n",time2);
/
count1=0;count2=0;
time1=0;time2=0;
st1=clock();
for(int i=2;i<10000000;i++){
if(isprime(i))count1++;
}
printf("%d\t",count1);
ed1=clock();
time1=(double)(ed1-st1)/CLOCKS_PER_SEC;
printf("n=10000000时:t = %fs\n",time1);
st2=clock();
for(int i=2;i<10000000;i++){
if(isprime2(i))count2++;
}
printf("%d\t",count2);
ed2=clock();
time2=(double)(ed2-st2)/CLOCKS_PER_SEC;
printf("n=10000000时:t = %fs\n",time2);
///
count1=0,count2=0;
time1=0,time2=0;
st1=clock();
for(int i=2;i<100000000;i++){
if(isprime(i))count1++;
}
printf("%d\t",count1);
ed1=clock();
time1=(double)(ed1-st1)/CLOCKS_PER_SEC;
printf("n=100000000时:t = %fs\n",time1);
st2=clock();
for(int i=2;i<100000000;i++){
if(isprime2(i))count2++;
}
printf("%d\t",count2);
ed2=clock();
time2=(double)(ed2-st2)/CLOCKS_PER_SEC;
printf("n=100000000时:t = %fs\n",time2);
}