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 ",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 3 5 7 ");//当位数为1的时候直接输出 53 } 54 else 55 { 56 judge(0,1);//否则进入judge,从位数pos=1开始找 57 } 58 } 59 return 0; 60 }