P1359Superprime
描述
农民约翰的母牛总是生产出最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。
农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说:
7 3 3 1
全部肋骨上的数字 7331是质数;三根肋骨 733是质数;二根肋骨 73 是质数;当然,最后一根肋骨 7 也是质数。
7331 被叫做长度 4 的特殊质数。
写一个程序对给定的肋骨的数目 N (1<=N<=8),求出所有的特殊质数。数字1不被看作一个质数。
格式
输入格式
单独的一行包含N。
输出格式
按顺序输出长度为 N 的特殊质数,每行一个。
并按大小顺序排列(从小到大).
样例1
限制
每个测试点1秒
提示
很简单,不要先算出来在交表-_-~~
来源
原题来自USACO
思路
1)从1位数的素数开始找,一位的素数有:2,3,5,7
2)对于数x,如果满足了长度len,就输出,如果还没满足,就搜下一个dfs(x,n+1)
代码
#include <iostream>
#include <cmath>
using namespace std;
int a[]={0,2,3,5,7},len; //1位数的素数只有2,3,5,7
int pd(int x) //判断素数
{
for(int j=2;j<=sqrt(x);j++)
if(x%j==0)
return 0;
return 1;
}
void dfs(int x,int n) //n为位数
{
if(n==len)
{
cout<<x<<endl;
return;
}
for(int k=1;k<=9;k+=2)
{
int t=x*10+k;
if(pd(t))
dfs(t,n+1); //找n+1位的素数
}
}
int main()
{
cin>>len;
for(int i=1;i<=4;i++)
dfs(a[i],1);
return 0;
}