此题用回溯,原来的时候一直wa,很郁闷,提交了十来次,最后发现时存素数的那个数组开小了,19+20 最多能有四十,原来才开了20;
#include<stdio.h>
#include<string.h>
int a[22], n, p[50], v[22];
int num=1,flag;
int prime(int x)
{
int i;
if(x==1)
return 1;
else
for(i=3;i<x;i++)
if(x%i==0)
return 0;
return 1;
}
void dfs(int x)
{
int i;
if(x==n&&p[a[0]+a[x-1]])
{
if(!flag)
{
printf("Case %d:\n",num);
flag=1;
}
printf("%d",a[0]);
for(i=1;i<x;i++)
printf(" %d",a[i]);
printf("\n");
}
else
for(i=2;i<=n;i++)
{
if(!v[i]&&p[i+a[x-1]])
{
a[x]=i;
v[i]=1;
dfs(x+1);
v[i]=0;
}
}
}
int main()
{
int i;
memset(p,0,sizeof(p));
for(i=1;i<50;i++)
if(prime(i))
p[i]=1;
p[4]=0;
/* for(i=1;i<22;i++)
printf("%d ",p[i]);*/
while(~scanf("%d",&n))
{
flag=0;
memset(v,0,sizeof(v));
a[0]=1;//v[0]=1;
//printf("Case %d:\n",num);
//for(i=2;i<=n;i++)
dfs(1);
printf("\n");
num++;
}
return 0;
}
#include<stdio.h>
#include<string.h>
int a[22], n, p[50], v[22];
int num=1,flag;
int prime(int x)
{
int i;
if(x==1)
return 1;
else
for(i=3;i<x;i++)
if(x%i==0)
return 0;
return 1;
}
void dfs(int x)
{
int i;
if(x==n&&p[a[0]+a[x-1]])
{
if(!flag)
{
printf("Case %d:\n",num);
flag=1;
}
printf("%d",a[0]);
for(i=1;i<x;i++)
printf(" %d",a[i]);
printf("\n");
}
else
for(i=2;i<=n;i++)
{
if(!v[i]&&p[i+a[x-1]])
{
a[x]=i;
v[i]=1;
dfs(x+1);
v[i]=0;
}
}
}
int main()
{
int i;
memset(p,0,sizeof(p));
for(i=1;i<50;i++)
if(prime(i))
p[i]=1;
p[4]=0;
/* for(i=1;i<22;i++)
printf("%d ",p[i]);*/
while(~scanf("%d",&n))
{
flag=0;
memset(v,0,sizeof(v));
a[0]=1;//v[0]=1;
//printf("Case %d:\n",num);
//for(i=2;i<=n;i++)
dfs(1);
printf("\n");
num++;
}
return 0;
}