筛选法求素数

我们都知道求一个数是不是素数的方法是十分简单的,但是当你判断一个数字集合里面都有哪些素数的时候,纯暴力法就会显得效率十分低下,这时候就需要用技巧筛掉明显不是素数的数字,剩下的再采用暴力直接求解,那么那些明显不是素数呢?首先偶数全不是素数,其次一个素数的倍数也不是素数,那么筛掉这两种情况剩余的一定是素数(反证法可证明),程序如下:

 1 int min,max;
 2     int t;
 3     int i,j,k;
 4     int flag[10000] = {0};
 5     int num[10000];
 6     num[2] = 1;
 7     num[1] = 0;
 8     printf("请输入数字的区间范围:");
 9     scanf("%d,%d",&min,&max);
10     if(min > max)
11     {
12         t =min;
13         min = max;
14         max = t;
15     }
16     //4以后的偶数全不是素数
17     for(i = 4; i<= max; i+=2)
18     {
19         flag[i] = 1;
20     }
21     //从3开始计算
22     for(i = 3 ;i <= max;i++)
23     {
24         if(flag[i])
25         {
26             num[i] = num[i - 1];
27             continue;
28         }
29         else
30         {
31             num[i] = num[i - 1] + 1;
32             //素数的倍数全不是素数
33             for(k = i ; k <= max; k+=i)
34             {
35                 flag[k] = 1;
36             }
37         }
38     }
39     printf("在%d到%d之间,一共有%d个素数",min,max,num[max] - num[min]);
40     system("pause");
41     return 0;

原文地址:https://www.cnblogs.com/baikequanshu/p/3381609.html