巧排数字 C语言将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数.编程打印出所有的排法.只有源码的不给分,要思路,怎么递归为什么这

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/02 09:34:42
巧排数字 C语言将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数.编程打印出所有的排法.只有源码的不给分,要思路,怎么递归为什么这

巧排数字 C语言将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数.编程打印出所有的排法.只有源码的不给分,要思路,怎么递归为什么这
巧排数字 C语言
将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数.编程打印出所有的排法.
只有源码的不给分,要思路,怎么递归为什么这么递归,分解成了什么样的小问题,让我懂

巧排数字 C语言将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数.编程打印出所有的排法.只有源码的不给分,要思路,怎么递归为什么这
哈,你也魔兽世界啊!
这里提供了三种方法:
(注意:为了让程序更快,根据排列的特点,每种方法都固定了最后一个元素,这样输出只是满足条件中的一部分,但是你可以修改每种方法中的输出,所有元素通过移动一个位置来输出, 如123,第一次输出123,第2次231,第3次312,这样就可以得到所有的解.)
下面只对其中的暴力方法做简单的说明.
暴力方法思想:对1-n做出所有的排列,然后依次检查每个排列看是否满足条件,满足的输出.
其中的递归只是做出排列.排列递归的思想就是,任选1到n中的一个放到最后位置,(递归)任选剩余的数中的一个放到次后位置,*** ,按照这样循环下去.
顺便提一下,这种方法很慢,做完所有排列要进行递归几十亿亿次,你要等很久(可能久到几个小时,哈哈)才能看到结果. 但是,你可以把我注释的for语句代替其下的for可以快一点看到结果.
具体看代码中的解释.
看懂暴力方法,就能看懂方法三了.一就不用看了,可能你也看不懂.虽然它的速度是这三个比较快的一个,但理解也更难.
如果这样你都看不懂,那么是你的问题了,可能你根本不知道什么是排列,也可能你根本不知道什么是递归,一切都是白说.(那样你应该找本书看,而不是光问.)
#include
#include
#include
#include
#include
bool IsPrimeNumber(int n)
{ /*判断素数*/
int i;
int sqrootN;
if ( n == 2 ) {
return true;
} else if ( n%2 == 0 || n==1 ) {
return false;
}
sqrootN = (int)( sqrt(n)+0.1 )+1;
i = 3;
while ( i < sqrootN ) {
if (n%i == 0) {
return false;
}
i += 2;
}
return true;
}
void Swap(int *a, int *b)
{ /*交换两数*/
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
bool IsOk(int *arr, int arrsize)
{ /*判断是否满足条件*/
if ( !IsPrimeNumber(arr[arrsize-1]+arr[0]) ) {
return false;
}
while( --arrsize > 0 ) {
if ( !IsPrimeNumber(arr[arrsize]+arr[arrsize-1]) ) {
return false;
}
}
return true;
}
////////////////////////////////////////////////////////
// 方法一:
bool Adjust_Pair(int *arr, int arrsize, int depth)
{
static int total=0;
bool ret = false;
int i;
if ( depth==2 ) {
if ( IsPrimeNumber(arr[0]+arr[arrsize-1]) ) {
total++;
printf("\n%03d: ",total);
for( i=0; i1; i-=2) {
if ( IsPrimeNumber(arr[i-1]+arr[depth-2]) ) {
Swap(arr+depth-3, arr+i-1);
Swap(arr+depth-4, arr+i-2);
if ( Adjust_Pair(arr, arrsize, depth-2) ) {
ret = true;
}
Swap(arr+depth-3, arr+i-1);
Swap(arr+depth-4, arr+i-2);
}
}
return ret;
}
bool Make_Pair(int *arr, int arrsize, int depth)
{
bool ret = false;
int i;
static int total1=0;
static int total2=0;
if ( depth==0 ) {
return Adjust_Pair(arr, arrsize, arrsize);
}
for( i=0; i

巧排数字 C语言将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数.编程打印出所有的排法.只有源码的不给分,要思路,怎么递归为什么这 有3个数,将这3个数的每位分离出来正好表示从1-9这9个数字且不重复,如果将这3个数按一定次序排,那么后那么后一个数字将比前一个数大333,求这3个数.用C语言写 将1-9这9个不同的数字分别填入3*3的方格中,要求每行自左至右数字从小到大排,每列自上到下数字也从小到大排,并且5排在正中的方格,则不同的填法共有()A.24 B.20 C.18 D.12 C语言 求20个数字的和并不一定是20个数字的总和,例如:输入4 3 2 1;输出:10; 输入:1 2 3 4 5 6 7 8 9 10;输出:55 排除非数字,例如:输入1 2 3adcd 4 5 6efgh 7 8 9 10 ;输出:55 从 1,2,3,4,5 这五个数字中,任取三个组成无重复数字的三位数,但当三个数字中有 2 和3 时,2 需排在3 前面(不一定相邻),这样的三位数有( )A.9 个 B.15 个 C.42 个 D.51 个 怎样用c语言编程使它排列出1,2,3,4这四个数的24种排列情况 C语言 巧填数字AB FC D E 将1-6数字填入ABCDEF内,使A*B*C*D*E*F=720且A+B+C=C+D+E=E+F+A请问怎么写? C语言如何实现组合后多条匹配条件过滤输出问题用C语言同时满足下列2个条件就输出源代码(1)假定从1-15这15个数字中任选6个全组合输出(每行输出6个不相同数字,并且从小到大排列)(2)将第一 C语言如何实现满足多条件匹配简单过滤问题用C语言同时满足下列2个条件就输出源代码(1)假定从1-11这11个数字中任选6个全组合输出(每行输出6个不相同数字,并且从小到大排列)(2)将第一问得 6个数字排组,4个数字一组,不重复.能排多少组 例如:1,2,3,4,5,6这六个数字以4个数字一组能排多少组!帮忙一组一组排出来,谢谢 在C语言中“输入四个数字,将其颠倒顺序输出”.例如,输入:1,2,4,3,输出:3,4,2,1 例1、 用0,2,3,4,5,五个数字,组成没有重复数字的三位数,其中偶数共有( ).A. 24个 B.30个 C.40个 D.60个 [分析]由于该三位数为偶数,故末尾数字必为偶数,又因为0不能排首位,故0就是其中的“特殊 例1、 用0,2,3,4,5,五个数字,组成没有重复数字的三位数,其中偶数共有( ).A. 24个 B.30个 C.40个 D.60个 [分析]由于该三位数为偶数,故末尾数字必为偶数,又因为0不能排首位,故0就是其中的“特殊 用0,1,2,3,4,5这六个数组成没有重复数字的四位偶数,将这些四位数从小到大排 由1,2,3,4,5这五个数字可以组成许多五位数,将他们从小到大依次排列,那么41235应排在第几位? C语言 设计算法输入一个四位正整数,将它们倒排,例如输入1234,输出4321.设计算法输入一个四位正整数,将它们倒排,例如输入1234,输出4321.(提示:分别应用/ 求整数部分,%求余数部分.例如7/5=1,7%5=2 将1-16这16个数字按一定规律排,要求最终能保证他横.竖.斜相加都等于34,问:怎么排! 数字168排在第几行第几列?为什么?将自然数按如下顺序排列:1、2、6、7、15、16...3、5、8、14、17...4、9、3...10、12...11...在这样的排列下,数字3排在第2行第1列,数字13排在第3行第3列.问:数字排