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;
}