原题网址
由于某些原因,这个网址会进不去…
题目描述
农民约翰母牛总是产生最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说:
- 7331 7331 7331
- 全部肋骨上的数字
7331
是质数; - 三根肋骨
733
是质数; - 二根肋骨
73
是质数; - 当然,最后一根肋骨
7
也是质数。
7331
被叫做长度
4
4
4的特殊质数。写一个程序对给定的肋骨的数目
N
(
1
≤
N
≤
8
)
N(1\le N\le8)
N(1≤N≤8),求出所有的特殊质数。数字
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 ∼