作业帮 > 综合 > 作业

巧排数字 C语言将1、2、...、20这20个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数.

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/16 15:49:44
巧排数字 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个数排成一排,使得相邻的两个数之和为一个素数,且首尾两数字之和也为一个素数. 如何用计算机编程解决“把12到0这二十个数排成一个圈~使得相邻两数之和为素数” 从1~9中选出8个数排成一个圆圈,使得相邻的两数之和都是质数.排好后可以从任意两个数字之间切开,按顺时针方向读这些八位数 从1~9中选出8个数排成一个圆圈,使得相邻的两数之和都是质数.排好后可以从任意两个数字之间切开,按顺时针方向读这个8位数 任意输入一个偶数,请装它分解为两个素数之和.【不要c语言,就要数字这样的】 将1至5这五个数字排成一排,最后一个数是奇数,且使得其中任意连续三个数之和都能被这三个数中的第一个数整除,那么满足要求的 将1,2,3,4,5这五个数字排成一排,最后一个数是奇数,且使得其中任意连续三个数之和都能被这三个数中的第一个数整除,那 c语言中,为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数. c++编程:将1,2,3,4..20这20个连续自然数排成一圈,使任意两个相邻自然数之和均为素数. 素数环pascal【问题描述】将1~n这n个数字首尾相连,形成一个圆环,要求圆环上任意两个相邻的数字之和都是一个素数,请 C语言编程:输出满足“一个偶数总能表示为两个素数之和.”的数,自己定义一个范围. 一个素数的3倍与另一个素数的2倍之和为100,这两个素数的积是?