求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 }

 

posted @ 2017-03-15 19:12  congmingyige  阅读(363)  评论(0编辑  收藏  举报