题目描述
超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数总为质数,例如373->37->3,233->23->2,这两个都是长度为3的超级素数。
输入
输入一个整数n (10≤n≤1000000000)。
输出
从小到大输出所有小于等于n的超级素数,每个超级素数之间留一个空格。
样例组
样例1
输入 10
输出 2 3 5 7
样例2
输入 100
输出 2 3 5 7 23 29 31 37 53 59 71 73 79
题目思路
这道题由于数据范围比较大,用普通的判素数函数+单循环判断绝对是不行的,用埃式筛也是不可以的(数组开不到这么大)。同时,这种题目也不像可以用各种朴素算法通过的题目。因此,我们可以借助STL中的队列(queue)来解决这道题目。
我们可以先开一个数组(或STL里的vector<>)储存最后的答案,再开一个队列,将2,3,5,7四个素数弹入队列,然后判断q.front是否大于输入的值,如果大于,弹出;否则将q.front存入数组,同时开一个变量T储存q.front,并将其弹出队列。紧接着,我们可以用一层
for
循环循环1-9的奇数,看T在末尾加上那个奇数后是否是质数。如果是,将加上那个奇数后的T弹入队列。至于怎么判质数?用洛谷筛(O(sqrt(n))还是能过的。
最后,可以用到宽搜+队列的切出条件while(!q.empty())来判断是否跳出while循环。最后输出数组即可。
这道题的主程序如下:
queue<int>q;vector<int>a;int x;
int cx()
{
q.push(2);q.push(3);q.push(5);q.push(7);
while(!q.empty())
{
int t=q.front();
if(t>x) break;
a.push_back(t);q.pop();
for(int i=1;i<=9;i+=2)
if(pzs(t*10+i)) q.push(t*10+i);
}
}
题目标程
这道题目的标程如下:
#include<bits/stdc++.h>
using namespace std;
queue<int>q;vector<int>a;int x;
bool pzs(int n)
{
if(n<2) return 0;
for(int i=2;i*i<=n;i++)
if(n%i==0) return 0;
return 1;
}
int main()
{
cin>>x;
q.push(2);q.push(3);q.push(5);q.push(7);
while(!q.empty())
{
int t=q.front();
if(t>x) break;
a.push_back(t);q.pop();
for(int i=1;i<=9;i+=2)
if(pzs(t*10+i)) q.push(t*10+i);
}
for(int i=0;i<a.size();i++) cout<<a[i]<<' ';
return 0;
}
这道题目就这么多。(似乎也不是特别难)