素数环问题
例:
杭电1016题
A环是由n周期图中所示。将自然数1,2,...中,n分别到每个圆,并在两个相邻的圆圈中的数字的总和应该是一个素数。注:
第一个圆的数目应始终为1。
代码实现:
#include <stdio.h>
#include <math.h>
int NUM[20];
int Prim( int val , int i , int num , int n)///----判断
{
int j;
for(j = 2 ; j <= sqrt(val+i) ; j++){///---素数
if((val+i)%j == 0){
return 0;
}
}
for(j = 0 ; j < num ; j++){///-----是否有相等
if(i == NUM[j])
return 0;
}
if( num == n-1){
for(j = 2 ; j <= sqrt(NUM[0]+i) ; j++){///-----最后一个和第一个相加后是否是素数
if((NUM[0]+i)%j == 0){
return 0;
}
}
}
return 1;
}
void Show(int n)///---------打印
{
int i;
for(i = 0 ; i < n ; i++){
if(i > 0)
printf(" ");
printf("%d",NUM[i]);
}
printf("\n");
}
void Prime_Cri(int num , int n)///-------算法
{
int i;
if(num == n)
return ;
for(i = 2 ; i <= n ; i++){
if(Prim(NUM[num-1] , i , num , n)){
NUM[num] = i;
Prime_Cri(num+1 , n);
if( num == n-1)
Show(n);
}
}
}
int main()///---------main()
{
int n , i = 0;
while(~scanf("%d",&n)){///----多组输入
i++;
memset(NUM , 0 , sizeof(NUM));
printf("Case %d:\n",i);
NUM[0] = 1;
Prime_Cri(1,n);
printf("\n");
}
return 0;
}
案例:
4
Case 1:
1 2 3 4
1 4 3 2
5
Case 2:
6
Case 3:
1 4 3 2 5 6
1 6 5 2 3 4
8
Case 4:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2