【SSL】2021-08-18 1368.特殊的质数肋骨

原题网址

由于某些原因,这个网址会进不去…

1368.特殊的质数肋骨 - 原题网址

题目描述

农民约翰母牛总是产生最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说:

  • 7331 7331 7331
  • 全部肋骨上的数字7331是质数;
  • 三根肋骨733是质数;
  • 二根肋骨73是质数;
  • 当然,最后一根肋骨7也是质数。

7331被叫做长度 4 4 4的特殊质数。写一个程序对给定的肋骨的数目 N ( 1 ≤ N ≤ 8 ) N(1\le N\le8) N(1N8),求出所有的特殊质数。数字 1 1 1不被看作一个质数。

格式

输入格式

单独的一行包含 N N N

输出格式

按顺序输出长度为 N N N的特殊质数,每行一个。

样例

输入样例

4

输出样例

2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393

解题思路

这道题是一道要用筛选法 d f s dfs dfs(深度优先搜索) 的题。每次都判定下一个数是否为质数,这样就可以直接输出而无需再次判定。

Code

#include<iostream>
#include<cmath>
using namespace std;
int n, m[100000000], maxn;

void init()
{
	cin>>n;
	if (n == 8) return;
	maxn = pow(10, n) - 1;
	m[1] = 1;
	for (int i = 2; i <= sqrt(maxn); i ++) if (!m[i]) for (int j = 2; i * j <= maxn; j ++) m[i * j] ++;
}

void dfs(int dep, int s) // dep表示当前位数,s表示当前数 
{
	if (dep > n)
	{
		cout<<s<<endl; // 由于每次都判定过了,因此无需再判定 
		return;
	}
	for (int i = 1; i <= 9; i ++)
	{
		if (!m[s * 10 + i]) // 判定下一个数是否为质数 
		{
			dfs(dep + 1, s * 10 + i);
		}
	}
}

int main()
{
	init();
	if (n == 8) // 由于n=8时会超时,所以打表 
	{
		cout<<"23399339\n29399999\n37337999\n59393339\n73939133\n";
		return 0;
	}
	dfs(1, 0);
	return 0;
}

大功告成 ∼ \sim

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值