筛法求素数优化
来源:互联网 发布:什么是网站主题优化 编辑:程序博客网 时间:2024/06/09 13:43
之前在一篇博客http://blog.csdn.net/once_hnu/article/details/6302283看到了一个筛法求素数优化的程序,于是好奇写了一下思路,留着以后看什么题用用。都在注释里面
#define Max 1000000 bool prime[Max]; void IsPrime(){ prime[0]=prime[1]=0;prime[2]=1; for(int i=3;i<max;i++) prime[i]=i%2; int t=(int)sqrt(Max*1.0); for(int i=3;i<=t;i++) if(prime[i]) for(int j=i*i;j<Max;j+=2*i) prime[j]=0; //也可以顺便加一个记录素数的数组 /*筛法求素数的原理是什么呢?在第一个for循环把所有的偶数都筛掉了,那么在第二个for循环开始筛的时候,之所以从i*i开始,是因为i在这一定是一个奇数,i*(i-1)中的i-1肯定是一个偶数在之前被筛掉了,然后i*(i-2)在之前筛i-2的时候就已经筛掉了,所以就可以从i*i开始筛。同时,每次j+2*i,是因为i,j是奇数,j+奇数倍i是一个偶数在之前被筛掉了,所以就可以只筛偶数倍的i。但是这种办法会筛一个数多次,那么怎么优化呢?*/第二个还没看懂...先放其他的
这个也许是只筛一次的
void Prime() { memset(a, 0, n*sizeof(a[0])); int num = 0, i, j; p[num++]=2;a[2*2]=1; for(i = 3; i < n; i+=2) { if(!(a[i])) p[num++] = i;//i是素数就标记 for(j = 0; (j<num && i*p[j]<n); ++j) { a[i*p[j]] = 1; if(!(i%p[j])) break;//i是合数则跳出 } } }
我们用a数组来记录i的最小质因数,那么就可以直接因式分解了.
void Prime2() { memset(a, 0, n*sizeof(a[0])); int num = 0, i, j; for(i = 2; i < n; ++i) { if(!(a[i])) p[num++] = i; for(j = 0; (j<num && i*p[j]<n && (p[j]<=a[i]||a[i]==0)); ++j) { a[i*p[j]] = p[j]; } }}
0 0
- 筛法求素数及其优化
- 筛法求素数优化
- 筛法求素数(优化版)
- 素数算法逐步优化
- 素数算法逐步优化
- 素数输出优化
- 优化::素数环
- 素数求解及其优化
- 素数的优化求法
- 素数筛选及优化
- 素数筛和优化
- 素数判断+优化
- 素数优化时间
- 求素数的优化算法
- 11、素数算法逐步优化
- WV.51-素数筛选优化
- 输出素数的代码优化
- 输出素数的优化算法
- web文件上传大小限制
- ubuntu下重装WIN7
- 关于android中主线程和子线程间的相互通讯
- 1到a是倒数和。
- 第四周项目1-求最大公约数
- 筛法求素数优化
- 欢迎使用CSDN-markdown编辑器
- C语言关键字总结
- 个人所得税计算器
- eclipse创建android项目,无法正常预览布局文件
- Java和JVM运行原理
- java-堆排序
- 数据结构,链表基本操作
- 2016年蓝桥杯java B组省赛总结及注意1