Question:
将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环。
n=20时,下面的序列就是一个素数环:
1 2 3 4 7 6 5 8 9 10 13 16 15 14 17 20 11 12 19 18
Answer:
#include <iostream>
#include <cstring>
using namespace std;
int p[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61,
67, 71, 73, 79, 83, 89, 97 };
bool isPrim(int x) {
// [0, size) using binary search
int size = sizeof(p) / sizeof(int);
int low = 0;
int high = size;
int mid;
while (low < high) {
mid = low + (high - low) / 2;
if (p[mid] == x) {
return true;
}
if (p[mid] > x) {
high = mid;
} else if (p[mid] < x) {
low = mid + 1;
}
}
return false;
}
int n;
bool vis[17];
int ans[17];
int primeLoop(int cur) {
if (cur == n + 1) {
if (isPrim(ans[n] + ans[1])) {
for (int i = 1; i <= n; i++) {
cout << ans[i] << " ";
}
cout << endl;
}
} else {
for (int i = 2; i <= n; i++) {
if (!vis[i]) {
ans[cur] = i;
vis[i] = true;
if (isPrim(ans[cur] + ans[cur - 1])) {
primeLoop(cur + 1);
}
vis[i] = false;
}
}
}
}
int main() {
memset(vis, 0, sizeof(vis));
cin >> n;
ans[1] = 1;
primeLoop(2);
}
Run Result,
6
1 4 3 2 5 6
1 6 5 2 3 4