求素质的算法
2016-02-22 11:30
183 查看
根据素数的性质:只能被1和它本身整除,不过如果直接编写循环与自身除,时间复杂度很高,不好。
利用其它的一些性质可以修改算法,比如偶数肯定不是素数(除了2)。
定理: 如果n不是素数, 则n有满足1<d<=sqrt(n)的一个"素数"因子d。
所以有如下程序:
对于每个n,只判断3,5,7……等基数因数,并且只判断到<=sqrt(n)。
时间复杂度变为O(sqrt(n))。
再补个斐波那契数列的程序,很简单:
其实根据计算机的long long最大就64位。所以直接查表是时间复杂度最低的方法。
利用其它的一些性质可以修改算法,比如偶数肯定不是素数(除了2)。
定理: 如果n不是素数, 则n有满足1<d<=sqrt(n)的一个"素数"因子d。
所以有如下程序:
bool isPrime(long n) { if (n <= 1) return false; if (n == 2 || n == 3) return true; for (int i = 3; i*i <= n; i+=2)//sqrt(n)效率较低 { if (n%i == 0) return false; } return true; }
对于每个n,只判断3,5,7……等基数因数,并且只判断到<=sqrt(n)。
时间复杂度变为O(sqrt(n))。
再补个斐波那契数列的程序,很简单:
void Fibonacci() { long i1 = 0; long i2 = 1; long i3; cout << i1 << endl; cout << i2 << endl; while (true) { i3 = i1 + i2; i1 = i2; i2 = i3; cout << i3 << endl; if (i3 >= INT_MAX/2) { break; } } }
其实根据计算机的long long最大就64位。所以直接查表是时间复杂度最低的方法。
static const int Fibonacci[] = { 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597, 2584,4181,6765,10946,17711,28657,46368,75025,121393,196418, 317811,514229,832040,1346269,2178309,3524578,5702887,9227465, 14930352,24157817,39088169,63245986,102334155,165580141,267914296, 433494437,701408733,1134903170,1836311903,-1323752223 };
相关文章推荐
- JVM调优总结(三)-基本垃圾回收算法
- JavaSE-反射
- 文字超出长度隐藏,显示省略号
- IO多路复用之epoll总结
- jenkins搭建集成构建环境(创建工程)
- postgres常用指令
- 《4》CentOS7.0+OpenStack+kvm云平台部署—配置Nova
- Spring AOP不拦截从对象内部调用的方法原因
- windows下安装和配置mongoDB
- coding
- C# partial关键字说明
- nginx限制ip并发数
- SQL阻止保存要求重新创建表的更改 在哪里设置
- SVN File Download
- Linux学习命令总结个人及个人心得
- Docker容器开机自动启动(在宿主机重启后或者Docker服务重启后)
- IO多路复用之select总结
- 数值的整数次方
- log4j获取IP显示在日志中
- ionic css 自定义样式