判断质数 O(n)复杂度打表
来源:互联网 发布:fade to black知乎 编辑:程序博客网 时间:2024/06/06 06:57
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int table[1000009];void print_table2()//table[i]==0,i为质数{ int x=sqrt(1000010)+1; for(int p=2;p<=x;p++) { if(table[p]!=0) continue; for(int q=p;q*p<=1000010;q++) { if(table[p]!=0) continue; for(int k=p*q;k<=1000010;k=k*p) { table[k]=1; } } }}int main(){ memset(table,0,sizeof(table)); print_table2(); int x; while(~scanf("%d",&x)) printf("%d\n",table[x]);}
说明:解决这个问题的诀窍是如何安排删除的次序,使得每一个非质数都只被删除一次。 中学时学过一个因式分解定理,他说任何一个非质(合)数都可以分解成质数的连乘积。例如,16=2^4,18=2 * 3^2,691488=2^5 * 3^2 * 7^4等。如果把因式分解中最小质数写在最左边,有16=4^2,18=2*9,691488=2^5 * 21609,;换句话说,把合数N写成N=p^k * q,此时q当然是大于p的,因为p是因式分解中最小的质数。由于因式分解的唯一性,任何一个合数N,写成N=p^k * q;的方式也是唯一的。 由于q>=p的关系,因此在删除非质数时,如果已知p是质数,可以先删除p^2,p^3,p^4,... ,再删除pq,p^2*q,p^3*q,...,(q是比p大而没有被删除的数),一直到pq>N为止。
因为每个非质数都只被删除一次,时间复杂度为线性时间。
阅读全文
0 0
- 判断质数 O(n)复杂度打表
- 线性筛 o(n)复杂度打素数表
- GCD&素数打表&快速判断质数
- 复制复杂链表O(n)时间复杂度
- 素数打表,复杂度(Onlogn)和O(n)(对与10^7来说线性快两倍) + 分解质因数
- 判断串中每种字符是否只出现一次,时间复杂度O(N)
- 算法复杂度计算O(N)
- 时间复杂度O(1) O(n)
- poj3518 打质数表
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 时间复杂度O(n)是什么意思
- 时间复杂度O(f(n))
- 实现左移指定位数,时间复杂度O(n) ,空间复杂度O(1)
- 第四十九题(排序,要求时间复杂度O(n),空间复杂度O(1))
- 数组中未出现的最小正整数(时间复杂度O(N),空间复杂度O(1))
- 素数打表(常用素数判断题节省时间复杂度)
- Linux下查看网卡的固件版本
- keras---minist手写识别
- Day5
- 解决 无法获得锁 /var/lib/dpkg/lock
- 一个小练习
- 判断质数 O(n)复杂度打表
- 2017.07.21工作日记
- 指纹识别分析之framework初始化流程
- Linux下的Jenkins+Tomcat+Maven+Gitlab+Shell环境的搭建使用(jenkins自动化部署)
- 导入项目后,jQuery文件报错解决方法
- xml属性
- CCF CSP 201703-1 分蛋糕(Java-100分)
- poj2576 Tug of War(二维费用背包)
- POJ