2319__1.5.3 Superprime Rib 特殊的质数肋骨

[Submit][Status][Forum]

Description

农民约翰母牛总是产生最好的肋骨。 你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。 农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说: 7 3 3 1 全部肋骨上的数字 7331是质数;三根肋骨 733是质数;二根肋骨 73 是质数;当然,最后一根肋骨 7 也是质数。 7331 被叫做长度 4 的特殊质数。 写一个程序对给定的肋骨的数目 N (1<=N<=8),求出所有的特殊质数。 数字1不被看作一个质数。

Input

单独的一行包含N。

Output

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

Sample Input

4

Sample Output

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

分析:还是没有完全理解到递归的思想,想不到递归那去。想了很久也没搞定,在网上找了题解,所以这题用递归。不管是几位数,它的第一个数一定是,2,3,5,7,确定了第一个数,第二个数之后的数就在(1,9)之间遍历,如果是素数并且位数等于所给的位数就输出。终止条件就是满足条件的位数等于所给的位数。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 int n;
 7 int prime(int m)//判断是否为素数数
 8 {
 9     int k,i;
10     k=sqrt(m);
11     for(i=2;i<=k;i++)
12     {
13         if(m%i==0)
14             break;
15     }
16     if(i==k+1)
17         return 1;
18     return 0;
19 
20 }
21 void judge(int primer,int pos)//primer是质数,pos是位数
22 {
23     if(pos==1)
24     {
25         judge(2,2);
26         judge(3,2);
27         judge(5,2);
28         judge(7,2);//当只有一位的时候
29     }
30     else
31     {
32         for(int i=1;i<=9;i++)
33         {
34             if(prime(primer*10+i)==1)//构造位数为pos+1的数
35             {
36                 if(pos==n)
37                     printf("%d\n",primer*10+i);//如果位数等于所给的位数
38                 else
39                 {
40                     judge(primer*10+i,pos+1);//否则,位数+1,继续递归下去;
41                 }
42             }
43         }
44     }
45 }
46 int main()
47 {
48     while(~scanf("%d",&n))
49     {
50         if(n==1)
51         {
52             printf("2\n3\n5\n7\n");//当位数为1的时候直接输出
53         }
54         else
55         {
56             judge(0,1);//否则进入judge,从位数pos=1开始找
57         }
58     }
59     return 0;
60 }

 




posted on 2018-09-29 13:00  一只小毛球  阅读(221)  评论(0编辑  收藏  举报

导航