本文参考了问题链接中答案
问题描述
一个环由n个圈组成,将自然数1-n放入圈内,使得任意相邻圈的两个数之和均为素数。第一个圈的元素均为1。下图为n=6时的一个例子:
程序样例
输入为一个整数n
- 6
- 8
输出分别为
-
1 4 3 2 5 6
1 6 5 2 3 4 -
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
解题思路: 栈的回溯调用,深度优先遍历(deep-first search)
当n为奇数时素数环不存在
- 证明:n为奇数时必然有偶数个奇数,排列成环时必然有两个奇数相邻,两个相邻的奇数相加就是偶数,偶数肯定不是素数。所以当n为奇数时素数环不存在。
以n=4为例:
-
栈的变化如下:
-
遍历的图如下:
算法实现
程序只适用n比较小的情况,如果n比较大,栈的递归调用深度过深,会导致栈溢出。此时需要自己定义一个栈来实现,而不该使用函数的栈递归调用。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
static unsigned int n;
static unsigned int *visited, *result;
// isprime function judge num whether is prime.
// please refer to https://blog.csdn.net/qq_36963214/article/details/90490364
unsigned int isprime(unsigned int num)
{
unsigned int i, half