求n(n>=2)以内的质数/判断一个数是否质数——方法+细节优化
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 //判断i是否质数,需要判断i能否被(long)sqrt(i)以内的数整除 5 //若i能被其中一个质数整除,则i不是质数;否则i是质数 6 7 int main() 8 { 9 //n=10 ans=4 10 //n=100 ans=25 11 //n=1000 ans=168 12 //n=10000 ans=1229 13 //n=100000 ans=9592 14 //n=1000000 ans=78498 15 //n=10000000 ans=664579 16 //n=100000000 ans=5761455 17 long i,j,n,flag,ans=1,t=1; 18 long *zhi=(long *) malloc (sizeof(long)*10000000); 19 scanf("%ld",&n); 20 zhi[0]=2; 21 for (i=3;i<=n;i++) 22 { 23 //若"zhi[t]*zhi[t]==i"成立,则i不是质数,不用继续判断 24 //且大于i的数需要用zhi[t]判断(j=0;j<t+1;j++) 25 //这个方法比"当质数大于(long)sqrt(i)时退出"速度快 26 //而(zhi[t]-1)*(zhi[t]-1)<=i<=n 27 //当i小于longint范围都能实现 28 if (zhi[t]*zhi[t]==i) 29 { 30 t++; 31 continue; 32 } 33 flag=1; 34 for (j=0;j<t;j++) 35 if (i%zhi[j]==0) 36 { 37 flag=0; 38 break; 39 } 40 if (flag) 41 { 42 zhi[ans]=i; 43 ans++; 44 } 45 } 46 printf("ans=%ld\n",ans); 47 /* 48 for (i=0;i<ans;i++) 49 printf("%ld ",zhi[i]); 50 printf("\n"); 51 */ 52 /* 53 if (zhi[ans]==n) 54 printf("%ld is a prime\n",n); 55 else 56 printf("%ld is not a prime\n",n); 57 */ 58 return 0; 59 }