Description
#include <cstdio>
#include <cmath>
using namespace std;
int n, t = 0;
int a[100] = {0};
int vis[50] = {0};//是否被使用过的标志
int isp[100] = {0};
int is_prime(int x)
{
int i = 1, k;
k = (int)sqrt(x);
for(i = 2; i <= k; i++)
{
if(x%i == 0)
{
break;
}
}
if(i <= k)
{
return 0;
}
return 1;
}
//深度优先搜素
void dfs(int cur)
{
if (cur == n && isp[a[0]+a[n-1]])//测试第一个和最后一个数,符合即输出
{
printf("1");
for (int i = 1; i < n; i++)
{
printf(" %d", a[i]);
}
printf("\n");
}
else
{
for (int i = 2; i <= n; i++)//尝试放置每一个数 i
{
if (!vis[i] && isp[i+a[cur-1]])//如果 i 没有用过,并且与前一个数之和为素数
{
a[cur] = i;
vis[i] = 1;//设置使用标志
dfs(cur+1);
vis[i] = 0;//清除标志
}
}
}
}
int main()
{
for(int i = 2; i <= 50; i++)//先存放一个素数表
{
isp[i] = is_prime(i);//判断是否为素数的 bool
}
while(scanf("%d", &n) != EOF && n)
{
t++;
a[0] = 1;
if (t > 1)
printf("\n");
printf("Case %d:\n", t);
dfs(1);
}
return 0;
}