题目描述
农民约翰的母牛总是产生最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。
农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数。
举例来说:7\ 3\ 3\ 17 3 3 1 全部肋骨上的数字 73317331 是质数;三根肋骨 733733 是质数;二根肋骨 7373 是质数;当然,最后一根肋骨 77 也是质数。73317331 被叫做长度 44 的特殊质数。
写一个程序对给定的肋骨的数目 nn,求出所有的特殊质数。11 不是质数。
输入格式
一行一个正整数 nn。
输出格式
按顺序输出长度为 nn 的特殊质数,每行一个。
输入输出样例
输入 #1复制
4
输出 #1复制
2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393
说明/提示
【数据范围】
对于 100%100% 的数据,1\le n \le 81≤n≤8。
题目翻译来自NOCOW。
USACO Training Section 1.5
上代码:
#include<bits/stdc++.h>
using namespace std;
bool isprime(int x) {
if (x%2==0) return false;
int m=sqrt(x);
for(int i=3;i<=m;i+=2)
if (x%i==0) return false;
return true;
}
int main() {
queue <int> q;
int n,m=4,a[]={2,3,5,7},b[]={1,3,7,9};
scanf("%d",&n);
for(int i=0;i<4;i++) q.push(a[i]);
for(int i=2;i<=n;i++) {
int l=m;
m=0;
for(int j=0;j<l;j++) {
for(int k=0;k<4;k++)
if (isprime(q.front()*10+b[k])) q.push(q.front()*10+b[k]),m++;
q.pop();
}
}
while(!q.empty()) {
printf("%d\n",q.front());
q.pop();
}
return 0;
}