计蒜客 Jesse's Code(全排列+素数判断)

问题描述:

Jesse 是个数学迷,他最喜欢研究“哥德巴赫猜想”,因此他的计算机密码也都采用素数。但一直用同一个密码是不安全的,所以他要经常更换他的密码。但他只允许自己的密码中出现某些数字,且密码的每一位都不相同。比如:1,2,41,2,4,则有 66 种情况:124,142,214,241,412,421124,142,214,241,412,421。其中 241241 和 421421 为素数。为了获得他的密码(他的机器上存放了第 44 届舜禹杯大学生程序设计竞赛的题目!),需要生成一个字典来帮助我们破解。请你来编写一个程序帮助我们(因为众所周知的原因我们迫切需要获得这些题目)。

输入格式

第一行输入密码的位数n (1 \leq n \leq 9)n(1n9)

第二行输入 1-n1n 个不重复的整数序列 (1 \leq x[i] \leq 9)(1x[i]9).

输入以 00 结束。

输出格式

按从小到大顺序输出所有的结果。如果一个结果也没有,输出NONE。每组数据后面跟随一个空行。

样例输入

3
1 2 4
0

样例输出

241
421

分析:C++中提供有全排列函数,使用next_permutation得到可能的组合,再判断是否为素数,是素数则输出;如果所有的都不是素数则输出“NONE”。

代码:

#include <algorithm>
#include <iostream>    
#include <cmath>    
using namespace std;    
int isprime(int n) {
	if(n < 2) return 0;
	for(int i = 2; i <= sqrt(n); i++) {
		if(n%i==0) return 0;
	}
	return 1;
}
int main()  {    
    int n, i, t;   
    while(cin>>n,n) {
    	int flag = 1;
    	int a[10]; 
        for(i = 0; i < n; i++)
            cin>>a[i];
        do {    
            t = 0;
            for(i = 0; i < n; i++) 
                t = 10*t + a[i];
			if(isprime(t)) {
				flag = 0;
                cout<<t<<endl;
			}   
        } while (next_permutation(a,a+n));    
        if(flag) cout<<"NONE"<<endl;
    }
	return 0;    
}  




猜你喜欢

转载自blog.csdn.net/adusts/article/details/80543409