首页 > 用户发贴区 > 编程问题提问区 > 回溯素数????
2008
11-26

小女子出来乍到 希望不要说我笨啊 嘿嘿 ~~~


老师留了个"回溯素数"问题 在网上找了个答案 没太看懂 


请各位大侠帮忙解释一下:


#include “math.h”
#include “iostream.h”

int N=2;//N为所有数
int a[3];//括号内为N+1

void trynum(int);
int check1(int j,int i);
int check2(int);
int check3(int j,int i);
void output();
static int ok=0;//用来记录合理的结果

int num=0;
void main()
{
int k;
for(k=1;k<=N;k++)
a[k]=0;
a[1]=1;
//cout<<1<<” “;
trynum(2);
}
void trynum(int i)
{ if(++num%20==0){num=0;}
// cout<<i<<” “;
int k;
for(k=2;k<=N;k++)//第2个位置有N-1种选择
if(check1(k,i)==1&& check3(k,i)==1)
{
a[i]=k;
if(i==N)output();//成功则打印
else //否则试下一个
{
trynum(i+1);
a[i]=0;
}
}
}

int check1(int j,int i)//j 为被测的数i为位置即a[i]=j是否可行
{
int k;
for(k=1;k<=i-1;k++)
if(a[k]==j)return (0);//被用过
return (1);//未被用
}

int check2(int x)//素数判断
{
int k;
int n=sqrt(x);
for(k=2;k<=n;k++)
if(x%k==0)return 0;
return 1;
}
int check3(int j,int i)//相邻和为素数
{
if(i<N)return (check2(j+a[i-1]));
else return (check2(j+a[i-1])&&check2(j+a[1]) );
}

void output()
{
int k;
cout<<endl<<”成功:”<<++ok<<”:”;
for(k=1;k<=N;k++)
{
cout<<a[k]<<”*”;
}
}


就是运行之后出现的结果 有点儿 不明白 



 


留下一个回复