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 }