20项素数和环——递归

题目:

     把n个正整数围成一个环,如果环中所有相邻的两个数之和都是一个素数,该环称为一个n项素数和环

     对于指定的n,构造并输出所有不同的素数和环。

设计要点:

     设置a数组在前n个正整数中取值,为避免重复输出,约定第1个数字a[1]=1;

     设置数组b标记奇素数。对指定的正整数n,首先要用试商判别法,把2n范围内的奇素数标记为1,例如b[7]=1表明7为奇素数。

#include<stdio.h>
#include<math.h>
int n,a[2000],b[1000];long s=0;
void main()
{ int t,j,k;
int p(int k);
  printf("   前n个正整数组成素数环,请输入整数n: "); 
  scanf("%d",&n);  
  for(k=1;k<=2*n;k++) 
b[k]=0;
  for(k=3;k<=2*n;k+=2)
     {for(t=0,j=3;j<=sqrt(k);j+=2)
         if(k%j==0)
            {t=1;break;}
		 if(t==0) b[k]=1;            // 奇数k为素数的标记  
	  }
  a[1]=1;k=2;//确定初始值
  p(k);
  printf("   前%d个正整数组成素数环,以上是其中3个。
",n); 
}
 // 素数环递归函数p(k)  
#include <stdio.h>
int p(int k)
{ int i,j,u;
  if(k<=n)
    { for(i=2;i<=n;i++)     
       { a[k]=i;            // 探索第k个数赋值i  
         for(u=0,j=1;j<=k-1;j++)
		        if(a[k]==a[j] || b[a[k]+a[k-1]]==0)  //  若出现重复数字  
u=1;        // 若第k数不可置i,则u=1  
if(u==0)           // 若第k数可置i,则检测是否到n个数  
           { if(k==n && b[a[n]+a[1]]==1 && s<3) // 若已到n个数时打印出一个解 
	              { s++; 
                printf(" %ld:  1",s);
                for (j=2;j<=n;j++)
                   printf(",%d",a[j]);
		            printf("
");
	               } 
          else  
				   p(k+1);     // 若没到m个数,则探索下一个数 p(k+1) 
        }
     }
}
return s;
}

  

原文地址:https://www.cnblogs.com/www-x/p/8242849.html