C0275 [USACO]特殊的质数肋骨
题目描述
农民约翰的母牛总是产生最好的肋骨。 你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。 农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说:7 3 3 1 全部肋骨上的数字 7331 是质数;三根肋骨 733 是质数;二根肋骨 73 是质数;当然,最后一根肋骨 7 也是质数。7331 被叫做长度 4 的特殊质数。 写一个程序对给定的肋骨的数目 N(1 \le N \le 8)N(1≤N≤8),求出所有的特殊质数。 数字 11 不被看作一个质数。
输入描述
单独的一行包含 NN。
输出描述
按顺序输出长度为 NN 的特殊质数,每行一个。
样例输入
4
样例输出
2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393
解题思路:
1,从一位已是素数的数往上进行递推;
2,每增加一位进行判断一次是否为素数,若为素数,则继续,否则,则不再进行处理;
3,一直到位数递推到n位,输出结果.
#include<stdio.h>
#include<math.h>
int n;
int prime(int n);
void fun(int x,int y);
int main()
{
scanf("%d",&n);
fun(2,1); //从一位为素数开始往上递推
fun(3,1);
fun(5,1);
fun(7,1);
return 0;
}
int prime(int n) //判断素数
{
int i;
if(n == 1 || n == 0) return 0;
for(i = 2 ; i*i <= n ; i++ )
{
if(n%i == 0) return 0;
}
return 1;
}
void fun(int x,int y) //x表示数值,y表示位数
{
int i;
if(y == n)
{
printf("%d\n",x);
return;
}
for(i = 1 ; i <= 9 ; i++ )
{
if(prime(x*10+i))
fun(x*10+i,y+1); //每一次*10就相当于往高位走了一位,位数+1
}
}