C++超级素数(Sprime)

  • Post author:
  • Post category:其他


题目描述

超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数总为质数,例如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;
}

这道题目就这么多。(似乎也不是特别难)



版权声明:本文为ceshyong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。