题目描述
Jesse是个数学迷,他最喜欢研究“哥德巴赫猜想”,因此他的计算机密码也都采用素数。 但一直用同一个密码是不安全的,所以他要经常更换他的密码。但他只允许自己的密码中出现某些数字,且密码的每一位都不相同。比如1 2 4,则有6种情况124 142 214 241 412 421。其中241 和 421为素数。为了获得他的密码(他的机器上存放了第4届舜禹杯大学生程序设计竞赛的题目!),需要生成一个字典来帮助我们破解。 请你来编写一个程序帮助我们(因为众所周知的原因我们迫切需要获得这些题目)。
输入
- Line 1:密码的位数n (1 ≤ n ≤ 9)。
- Line 2:1->n个不重复的整数序列 (1 ≤ x[i] ≤ 9).
输出
按从小到大顺序输出所有的结果。 如果一个结果也没有,输出“NONE”。 每组数据后面跟随一个空行。
样例输入
3
1 2 4
0
样例输出
241 421
递归,数组化为整数,然后判断是否是素数,注意用递归是,无结果输出NONE不好整,看个人啦,设置成static就可以AC了。
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cmath> using namespace std; long long a[15]; long long is_prime(long long x)//素数判断 { if(x==1 || x==4) return 0; if(x==2 || x==3) return 1; long long o=sqrt(x); for(long long i=2;i<=o;i++) { if(!(x%i)) return 0; } return 1; } int is_cout(long long a[],int m,int count)//输出处理 { long long s=0; for(int i=0;i<m;i++) { s=s*10+a[i]; } if(is_prime(s)){ cout<<s<<endl; count++; } return count; } int is_arrangement(long long a[],int k,int m,int count)//数组递归 { if (k==m) { count=is_cout(a,m,count); } else { for(int i=k;i<m;i++) { swap(a[k],a[i]); count=is_arrangement(a,k+1,m,count); swap(a[k],a[i]); } } return count; } int main() { int n,mm; while((cin>>n) && n) { static int count=0; for(int i=0;i<n;i++) { cin>>a[i]; } sort(a,a+n); mm=is_arrangement(a,0,n,count);//判断是否有输出结果 if(mm==0) cout<<"NONE"<<endl; cout<<endl; memset(a,0,sizeof(a)); } return 0; }