求把1,2,3,...,20这20个自然数排成一圈,使任意两个自然数之和为素数

来源:互联网 发布:java时间戳转换为date 编辑:程序博客网 时间:2024/05/14 05:00

本文从百度知道上获取

#include <stdio.h>#include <stdbool.h>int main(){bool prime[40] = {                               /*设一个查找表,可以快速地判断某数是否为素数*/0, 0, 1, 1, 0, 1, 0, 1, 0, 0,0, 1, 0, 1, 0, 0, 0, 1, 0, 1,0, 0, 0, 1, 0, 0, 0, 0, 0, 1,0, 1, 0, 0, 0, 0, 0, 1, 0, 0};bool used[21] = {                                /*快速判断哪些数已经被选中*/0, 1, 0, 0, 0, 0, 0, 0, 0, 0,            //a[0]无用,a[1]到a[20]分别存放选出的数    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0              //因为考虑到题目要求的循环性};                                               //所有的解都可以位移使得1出现在a[1]位置,所以我们就直接规定1放在a[1]int a[21] = {0, 1};int cnt = 1;              /*当发生无数可选的情况时,需要回退一步,此变量用来表示是否发生了回退*/bool tag = false;int i;while (cnt < 20){       
                /*如果发生了回退,则直接从上次选的数的后面开始查找,不是回退的话,则从2开始查找*/for (i = (tag ? a[cnt + 1] + 1 : 2); i < 21; i++){if ((! used[i]) && (prime[i + a[cnt]])){a[++cnt] = i;       /*找到符合条件的数*/used[i] = true;tag = false;break;}}if ((20 == cnt) && (prime[a[1] + a[20]])){for (i = 1; i < 21; i++){printf("%d ", a[i]);}printf("\n");}else if ((20 == cnt) ||(21 == i))        /*如果发生了无数可选的情况,则回退一步*/{ used[a[cnt--]] = false;tag = true;}}return 0;}



0 0
原创粉丝点击