素数环问题
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
把1到20这重新排列,使得排列后的序列A满足:
a. 任意相邻两个数之和是素数
b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的第k+1项小。
a. 任意相邻两个数之和是素数
b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的第k+1项小。
输入
没有输入。
输出
输出A,两个数字之间用一个空格隔开,第一个数字前面和最后一个数字后面没有空格。
输入样例
输出样例
提示
本题不提供输出样例。
#include <iostream> #include <stdlib.h> #include <math.h> using namespace std; #include <stdio.h> #include <math.h> #define LEN 20 int primeRing(int ring[], int b[], int n); int isPrime(int n); int main(void) { int i, ring[LEN]={0}, b[LEN]={0}; ring[0] = 1; b[0] = 1; if( primeRing(ring, b, 1) ) { //printf(" The prime ring is : "); for(i=0; i<LEN; i++) printf("%d ", ring[i]); //printf(" "); } else printf(" Not found! "); return 0; } int primeRing(int ring[], int b[], int n) { int i; if( n==LEN ) return isPrime(ring[n-1]+ring[0]); //printf(" Calculating ring[%d] = ", n); for(i=1; i<LEN; i++) if( b[i]==0 && isPrime((i+1)+ring[n-1]) ) { b[i] = 1; //cout<<" "<<i+1<<endl; ring[n] = i+1; //printf("%d ", ring[n]); if( primeRing(ring, b, n+1) ) return 1; else b[i] = 0; } return 0; } int isPrime(int n) { int i, t, f=1; t = sqrt(n); for(i=2; i<=t; i++) if( n%i==0 ) { f = 0; break; } return f; }
代码来自:http://blog.sina.com.cn/s/blog_52e9ba5f0100a1y9.html
我的代码:
#include <iostream> #include <math.h> using namespace std; int data[20] = {0}; bool choice[21] = {false}; bool IsPrimenum(int num) { //cout<<"have a look"<<endl; for(int i = 2;i <= sqrt(num); i++) if(num%i==0) return false; return true; } void FindPlan(int pos) { if(pos==20&&IsPrimenum(data[19]+data[0])) { for(int i = 0;i < 20; i++) cout<<data[i]<<" "; cout<<endl; return ; } else { for(int i = 1;i <= 20; i++) if(choice[i]==false&&IsPrimenum(data[pos-1]+i)) { data[pos] = i; choice[i] = true; //if(pos>=1&&IsPrimenum(data[pos-1]+data[pos])) FindPlan(pos+1); choice[i] = false; } } } int main() { int pos = 0; FindPlan(pos); return 0; }