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;
}
时间最会骗人,但也能让你明白,这个世界上没有什么是不能失去的,留下的尽力珍惜,得不到的都不重要
浙公网安备 33010602011771号