典型的电子商务网站,wordpress微信登录插件免费,python学了能干嘛,Wordpress 收费优化题目描述 素数就是不能再进行等分的整数。比如7#xff0c;11。而 9 不是素数#xff0c;因为它可以平分为 3 等份。一般认为最小的素数是2#xff0c;接着是 3#xff0c;5#xff0c;... 请问#xff0c;第 100002(十万零二)个素数是多少#xff1f; 请注意#xff1… 题目描述 素数就是不能再进行等分的整数。比如711。而 9 不是素数因为它可以平分为 3 等份。一般认为最小的素数是2接着是 35... 请问第 100002(十万零二)个素数是多少 请注意“2” 是第一素数“3” 是第二个素数依此类推。 运行限制 最大运行时间1s 最大运行内存: 128M 题目分析 对于这道题来说难点在于运行时间只要1秒钟的问题
这个问题核心解决在于对素数的判定能不能够更快一点
先来看第一种也是最慢的一种 第二种 稍微快一点 他确实也是快了一点点但是可以帮我们解决问题吗
确实能解决问题但是运行的非常慢时间复杂度是O(n) 第三种采用sqrt开根号的方式来继续这半找素数
这个方法比上面排查的数据更少 这个时间复杂度应该就是O(sqrt(n))
相对于上面的来说还是要快一点
第四种 直接卡到x/i这个位置 我们还可以列举出更大的质数来进行测试 每一个数都会除一下基本上也是除到sqrt(x)这样一个位置
上面这道题基本上来说就解决了。 知识拓展 讲一个查找20以内的所有素数假定是查找到20但是这个数据这个可能更大这里我们用一种埃氏筛选法
来说一下原理 这里贴一下测试代码
#include stdio.h
#include stdlib.htypedef long long ll;
//定义数组的大小
const int N 10000000;//一千万个数据int visit[N];//记录合数
int cnt0;//与prime关联的一个游标
int prime[N];//记录质数//找出到 N这样一个素数的一个查找
void find_prime(int n)
{//外层循环循环整体for(int i 2;i n;i) {//如果等于0的情况就是一个质数if(!visit[i]) {prime[cnt] i;//它的倍数一定是一个合数,然后按步长增长for(ll j i*i;jn;ji) {//全是合数visit[j] 1;//相应的i就是1 }}}
}int main()
{find_prime(20);for(int i 0;i cnt;i) {printf(%d ,prime[i]); }return 0;
}
下面在来说另外一种素数筛选方法
欧拉筛选也叫线性筛选法
用两句话来说明一下线性筛选法
第一每一个合数都是被它的一个最小因子筛选掉的
第二如果当前被筛选的是一个质数那么质数*质数是可以筛选掉一部分合数其实也是通过最小因子算出来的
第三用已知的素数去筛选合数避免重复筛选避免重复筛选这个过程就是一个位置如果一旦被标记为合数之后就不要重复标记为合数
一张图来说明一下线性筛选法 demo2.cpp
#include stdio.h
#include stdlib.h
#include vectorusing namespace std;vectorint get_primes(int n)
{vectorint primes;vectorbool is_prime(n1,true);//默认为true的情况下其实是为这质数的//下面开始循环for(int i 2;i n;i) {if(is_prime[i]) {primes.push_back(i);}for(int j 0;j primes.size() i * primes[j] n;j) {//只要有因子这个数标记为falseis_prime[i * primes[j]] false;//避免重复标记if(i % primes[j] 0) {break;}}}return primes;//返回一个vector数组
}int main()
{vectorint res get_primes(20);//采用for循环的方式进行打印vectorint::iterator it_begin res.begin();vectorint::iterator it_end res.end();//采用for循环的方式for(it_begin;it_begin ! it_end;it_begin) {printf(%d ,*it_begin);}printf(\n-------------------\n);//这里说过prime可以看成一个数组for(int i 0;i res.size();i) {printf(%d ,res[i]);//本身就可以当成数组对待}return 0;
}