高效求素数--筛法求素数

来源:互联网 发布:mac循环计数 编辑:程序博客网 时间:2024/06/10 19:21

高效求素数的方法


用筛法求素数的基本思想是:把从1开始的、某一范围内的正整数从小到大顺序排列, 1不是素数,首先把它筛掉。剩下的数中选择最小的数是素数,然后去掉它的倍数。依次类推,直到筛子为空时结束。如有:

1 2 3 4 5 6 7 8 9 10

11 12 13 14 15 16 17 18 19 20

21 22 23 24 25 26 27 28 29 30

1不是素数,去掉。剩下的数中2最小,是素数,去掉2的倍数,余下的数是:

3 5 7 9 11 13 15 17 19 21 23 25 27 29

剩下的数中3最小,是素数,去掉3的倍数,如此下去直到所有的数都被筛完,求出的素数为:

2 3 5 7 11 13 17 19 23 29

#include<stdio.h>#include<string.h>#define Num 30int main(){char a[Num];int i=0,j=0;int count = 0;memset(a,'y',Num);//初始化,数组中所有的元素赋值为真for(i=3;i<Num;i+=2){a[i-1] = 'n';//数组下标为偶数的2 4 6 8 10 12 14 16等等通通赋值为n,即代表2 4 6 8 10 12 14 16不是质数//printf("************%d******\n",i);for(j=i;(j<Num);j+=i)  {if((j%i==0) && (j!=i))  //此处可看到对i=3时,有3 6 9 12 15 18 21等元素只要下标不等于3时,其他下标值均能被3整除,故不是质数,//其余的i = 5,7等同理{a[j] = 'n';//注意此处已经将所有的下标为i的倍数的赋值为假count ++;//count用于记录循环的次数}}}a[2] = 'y';//前面操作将2设置为n,现在将其更正printf("***********************%d\n",count);//count用于记录循环的次数for(i=2;i<Num;i++){if(a[i] == 'y'){printf("%d\t",i);}}return 0;}/* i = 3,5,7,9 ...打印的j元素下标,我们可以看到除了i == j时元素应该保留,其余元素都应进行删除,此方法可以去掉对i = 3时的6,9,12,15,18不需要再进行处理i = 6,9,12...时的元素************3******369121518************5******51015************7******714************9******918************11******1122************13******1326************15******15************17******17************19******19*/


0 0
原创粉丝点击