题目大意:

给出一个整数n,要求输出所有n位超级质数。超级质数的定义为,一个“依次去掉最右边一位后依然为质数”的质数。

思路:

一个n位质数去掉最右边一位依然为质数,说明其一定从n-1位质数演变而来。通过广搜按位数从小到大的顺序搜索到第n位即可。

代码:

/*
ID: lujunda1
LANG: C++
PROG: sprime
*/
#include<iostream>
#include<stdio.h>
#include<cmath>
#include<queue>
using namespace std;
bool prime(int n)
//判断参数n是否为素数。 
{
	if(n<2)
		return false;
	for(int i=2;i<=sqrt(double(n));i++)
		if(n%i==0)
			return false;
	return true;
}
int bfs(int n)
//搜索n位超级质数。 
{
	queue<int> q;
	q.push(0);
	int temp=0;
	while(temp++<n)
	{
		int size=q.size();
		while(size--)
		{
			int head=q.front();
			q.pop();
			if(n==1)
				printf("2\n");
			if(temp==1&&n!=1)
				q.push(2);
			for(int i=1,son;i<10;i+=2)
			//除2以外,所有质数都是奇数,所以只搜奇数并对2做特殊处理即可。 
			{
				son=head*10+i;
				if(prime(son))
					if(temp==n)
					//若是n位数便直接输出。 
						printf("%d\n",son);
					else
					//不是n位数便压入队列。 
						q.push(son);
			}
		}
	}
}
int main()
{
	freopen("sprime.in","r",stdin);
	freopen("sprime.out","w",stdout);
	int n;
	scanf("%d",&n);
	bfs(n);
}