算法叙述:1.DFS(类似部分和问题)
我的代码:
<pre class="cpp" name="code">#include<iostream>
using namespace std;
int array[25]={0};
int exist[25]={0}; //看选择的数,是否已经用过(即array数组中已经存在)
int n;
int counter=0;
int prime(int a,int b) 函数是正确的
{
int n=a+b;
int flag=0;
if(!n)
{
cout<<"prime is wrong!!"<<endl;
}
for(int i=2;i*i<=n;i++)
{
if(!(n%i))
{
flag=1;break;
}
}
if(flag) return 0; //not prime
else return 1; //prime
}
void dfs(int i,int m)
{
//if(i==n-1)
if(i==n) //n是数组的长度,但不是数组最大数的下标
{ //这个if语句用于输出与判断最后一个数与第一个数(1)之和是否为素数
if(prime(m,1))
{
//array[i]=m;
for(int j=0;j<n;j++)
{
if(j==n-1) cout<<array[j]<<endl;
else cout<<array[j]<<" ";
}
}
}
for(int j=2;j<=n;j++)
{
if(!exist[j]&&prime(m,j))
{
exist[j]=1;
array[i]=j;
dfs(i+1,j);
exist[j]=0;
}
}
}
int main()
{
while(cin>>n)
{
counter++;
array[0]=1;
exist[0]=1;
cout<<"Case "<<counter<<":"<<endl;
dfs(1,1);
cout<<endl;
}
return 0;
}
算法学习自这个链接(但是那个程序有个不完美之处)
void dfs(int k,int now)
{
if(k==n)
{
if(isprime(now+1))
{
ans[k]=now;
for(int i=0;i<n;i++)
{
printf("%d%c",ans[i],i==n-1?'\n':' ');
}
}
return;
}
ans[k]=now多余了。
数组的第n+1项被赋值了,当然程序的运行结果没有错误。