Jesse's Code

题目描述

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).
输入0结束。

输出

按从小到大顺序输出所有的结果。 如果一个结果也没有,输出“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;
}
原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/6612207.html