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",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("\n"); } else p(k+1); // 若没到m个数,则探索下一个数 p(k+1) } } } return s; }
时间最会骗人,但也能让你明白,这个世界上没有什么是不能失去的,留下的尽力珍惜,得不到的都不重要