高效求素数--筛法求素数
来源:互联网 发布: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
- 高效求素数--筛法求素数
- 高效求素数
- 筛法高效求素数
- ACM刷题中高效求素数
- 求素数(筛法求素数)
- 【算法之高效求素数】浅析求素数算法
- 求素数的几种高效方法
- 求素数的几种高效方法
- 求素数
- 求素数
- 求素数
- 求素数
- 求素数
- 求素数
- 求素数
- 求素数
- 求素数
- 求素数
- Java:单例模式的七种写法
- php添加为kindeditor水印问题
- LeetCode -- Integer to English Words
- linux下vi的复制,黏贴,删除,撤销,跳转等命令 (转载)
- Java中不规则二维数组运用
- 高效求素数--筛法求素数
- 根据mysql表中字段创建hbase表
- Spring MVC配置response自动转json
- 进程和线程的一些问题
- ActiveMQ 即时通讯服务 浅析
- Unity着色器常用关键字及属性
- 解决HorizontalScrollView与SeekBar滑动冲突的问题.
- LeetCode -- Sum Root to Leaf Numbers
- 程序员整理的各种不错的工具