#include<stdio.h> #include<string.h> int mark[100]; int num[100]; int n; int count; int flag[100]; void prime() { int i, j; flag[0] = flag[1] = 1; for(i = 2; i <= 25; i ++){ if(flag[i] == 0){ for(j = i + i; j <= 50; j = j + i){ //是素数 在当前下标下赋值为1 flag[j] = 1; } } } } void full_array(int level){ // printf("%d\n", level); int i; if(level == n + 1 && flag[num[n] + num[1]] == 0){ for(i = 1; i <= n; i++){ printf("%d ", num[i]); } printf("\n"); } else{ for(i = 2; i <= n; i++){ if(mark[i] == 0 && flag[i + num[level - 1]] == 0){//!!记得判断最后一个数和第一个数 mark[i] = 1; num[level] = i; full_array(level + 1);//进入全排列 mark[i] = 0; } } } } int main () { prime(); flag[1] = 1; while(scanf("%d", &n) && n){ printf("Case %d:\n",++count); if(n % 2 && n > 1) printf("No Answer\n"); else{ memset(num, 0 , sizeof(int)*100); num[1] = 1; full_array(2); } } return 0; }
思路:
全排列 ,在每次进入下一层之前 都判断是不是素数 如果是素数走到下一层
走到最后一层的时候还要判断 最后一个数 是不是 和第一个数相加是不是 素数
素数环
最新推荐文章于 2024-06-01 10:00:49 发布