栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++超级素数(Sprime)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++超级素数(Sprime)

题目描述

        超级素数是指一个素数,每去掉后面一个数字,总能保证剩下的数总为质数,例如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循环。最后输出数组即可。

        这道题的主程序如下:

queueq;vectora;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
using namespace std;
queueq;vectora;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

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

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1015016.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号