1.筛法打素数表,先进行预处理数组
2.进行枚举,同时递归的时候标记数组,当找到最后一个数同时第一个数和最后一个数相加也是素数,进行输出。blog
int visited[21], a[21]; bool is_prime[100]; int n; void sieve() { for (int i = 0; i <= 40; i++) is_prime[i] = true; is_prime[0] = is_prime[1] = false; for (int i = 2; i <= 40; i++) { if (is_prime[i]) { for (int j = 2 * i; j <= 40; j += i) is_prime[j] = false; } } } void dfs(int num) { if (num == n && is_prime[a[num] + a[1]]) { for (int i = 1; i < num; i++) { printf("%d ", a[i]); } printf("%d\n", a[num]); } else { for (int i = 2; i <= n; i++) { if (visited[i] == 0) { if (is_prime[a[num] + i]) { a[++num] = i; visited[i] = -1; dfs(num); visited[i] = 0; num--; } } } } } int main() { int t = 0; sieve(); while (scanf("%d", &n) != EOF) { t++; printf("Case %d:\n", t); memset(visited, 0, sizeof(visited)); memset(a, 0, sizeof(a)); a[1] = 1; dfs(1); printf("\n"); } return 0; }