题意:给出n,输出n位超级质数,超级质数的定义为“依次去掉右边一位后仍然为质数的数”
因为一个n位质数去掉右边一位数之后仍然为质数,说明它是由n-1位超级质数演变而来的,
同理,n-1位超级质数也由n-2位超级质数演变而来- - -- - 所以按照位数从第一位广搜到n位即可
注意的地方是判重,最开始用的是一个vis[]数组,可是因为位数有8位,mle了 后来又想把每个数分成两半,比如73939133,可以这样判断vis[7393][9133]是否为1,= =后来发现这样用的内存貌似更多= =
最后用set就可以了,把搜到的符合题意的都放进去set里面,再输出set里面的元素就可以了,因为set里面的元素不重复
#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<set>
#include<vector>
#include<map> #include<queue>
#include<algorithm>
#define mod=1e9+7;
using namespace std; typedef long long LL;
int n;
set<int> p; int prime(int n){
if(n<) return ;
for(int i=;i<=sqrt(double(n));i++)
if(n%i==) return ;
return ;
} void bfs(){
int head,next;
queue<int>q;
q.push();
int tmp=; while(tmp++<n){
int size=q.size();
while(size--){
head=q.front();q.pop();
if(n==) p.insert();
if(tmp==&&n!=) q.push(); for(int i=;i<=;i++){
next=head*+i;
if(prime(next)){
if(tmp==n) p.insert(next);
else q.push(next);
}
}
}
}
}
int main(){
while(scanf("%d",&n)!=EOF){
p.clear();
bfs();
for(set<int>::iterator it=p.begin();it!=p.end();++it)
cout<<*it<<"\n";
}
return ;
}
另外还有一个地方就是(因为是看的一个pdf上的),在判断队列的时候,用size=q.size();while(size--)来判断队列是否为空
自己写的时候,写的是while(!q.empty()),后来发现这样会陷入死循环,当n>=2时,队列里面始终有2= =还木有改出来