c语言素数环问题实例讲解。c语言回溯算法应用。问题描述:将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。
n=20时,下面的序列就是一个素数环:
1 2 3 4 7 6 5 8 9 10 13 16 15 14 17 20 11 12 19 18
下面的程序利用回溯法穷举所有可能性,试图找到一个解。既然是环,第一个位置可以随意取一个数值(好象设置为1比其它数计算起来都要快,不信你把程序中的 ring[0] 设置为18计算一下。另外n好象只是偶数的时候才存在素数环)。这个问题应该还有很多种解法,和递归、图的 DFS 搜索、哈密顿环都有关系。我的问题是,能否写出一个比较高效的算法计算出对于任意n的全部素数环序列?
#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(“\n\nThe prime ring is : “);
for(i=0; i<LEN; i++)
printf(“%d “, ring[i]);
printf(“\n”);
}
else
printf(“\n\nNot found!\n”);
return 0;
}
int primeRing(int ring[], int b[], int n)
{
int i;
if( n==LEN )
return isPrime(ring[n-1]+ring[0]);
printf(“\nCalculating ring[%d] = “, n);
for(i=1; i<LEN; i++)
if( b[i]==0 && isPrime((i+1)+ring[n-1]) )
{
b[i] = 1;
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;
}