素数心得
2016-08-09 23:08
465 查看
素数思路 PS 可以从3开始每次加2进行判断构造素数数组
毕竟偶数都是合数
1、正常暴力解法
改进 判断的集合减少一半 时间减少一半 n/2
改进 集合减少至2到sqrt(n) 时间从n/2到开方(n)
2、如果先存有了素数数组 那么可以利用素数数组进行判断。(借鉴了网上大神的思路)
素数数组p[]={2,3,5,7,....}
例如x=10 x%2==0 所以x为合数
X=11 x%2!=0 x%3!=0 x%5!=0 x%7!=0 所以11是素数 添加到数组最后
毕竟偶数都是合数
1、正常暴力解法
//从2到n进行一一判断 bool fn(int i) { if(i==2) return true; for(int n=2;n<i;++n) { if(i%n==0) return false; } return true; }
改进 判断的集合减少一半 时间减少一半 n/2
bool fn(int i) { if(i==2) return true; for(int n=2;n<=i/2;++n) { if(i%n==0) return false; } return true; }
改进 集合减少至2到sqrt(n) 时间从n/2到开方(n)
bool fn(int i) { if(i==2) return true; for(int n=2;n<=sqrt(i)++n) { if(i%n==0) return false; } return true; }
2、如果先存有了素数数组 那么可以利用素数数组进行判断。(借鉴了网上大神的思路)
素数数组p[]={2,3,5,7,....}
例如x=10 x%2==0 所以x为合数
X=11 x%2!=0 x%3!=0 x%5!=0 x%7!=0 所以11是素数 添加到数组最后
//构造一个素数数组 void makePrimes(int primes[], int num) { int i, j, cnt; primes[0] = 2; primes[1] = 3; for(i = 5, cnt = 2; cnt < num; i += 2) { int flag = true; for(j = 1; primes[j]*primes[j] <= i; ++j) { if(i%primes[j] == 0) { flag = false; break; } } if(flag) primes[cnt++] = i; } } //判断是否为素数 bool isPrime(int primes[], int n) { if(n < 2) return false; for(int i = 0; primes[i]*primes[i] <= n; ++i) if(n%primes[i] == 0) return false; return true; }
相关文章推荐
- typedef和#define的用法与区别
- mac地址自增(通用简易版)
- C++实现根据类名动态生成类对象
- 确定C语言各类型变量取值范围(不通过头文件)
- 洛谷 P1096 RQNOJ P129 [NOIP普及组2007] Hanoi双塔问题
- #ifndef_code_#endif简析
- Effective C++读书笔记---资源管理要点总结
- LeetCode|Remove Duplicates from Sorted List
- C++‘异常’处理机制
- 双向链表(c++实现)
- 顺序表(C++实现)
- C语言编写—通讯录(小项目)
- 有趣的C语言小程序
- c语言中常见的关键字及其基本用法分析
- c语言初级小程序
- Microsoft Visual Studio 2010创建C语言程序的步骤
- windows C++进程间和线程间通信
- ndk学习18: JNI之C&C++调用Java
- ndk学习17: jni之Java调用C&C++
- 暑假集训 8.9 求二叉树的深度sdut2804 已知前中后中的两个序列建树及应用.