中易网

将1,2,3,…,9共9个数排成下列的三角形(用C++编程)

答案:2  悬赏:50  
解决时间 2021-01-17 20:38
  • 提问者网友:wodetian
  • 2021-01-17 02:31
将1,2,3,…,9共9个数排成下列的三角形(用C++编程)
最佳答案
  • 二级知识专家网友:你可爱的野爹
  • 2021-01-17 03:47
要使效率高,那就不能用递归函数,而要自己去迭代.

#include "stdio.h"

void 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]=;

//a[0]无用,a[1]到a[20]分别存放选出的数
//因为考虑到题目要求的循环性
//所有的解都可以位移使得1出现在a[1]位置
//所以我们就直接规定1放在a[1]
int a[21]=;

//已经选中的数的个数,
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(cnt==20 && prime[a[1]+a[20]])
{
for(i=1;i<21;i++)
printf("%d ",a[i]);
return;
}
//如果发生了无数可选的情况,则回退一步
else if(cnt==20 || i==21)
{
used[a[cnt--]]=false;
tag=true;
}
}
}
全部回答
  • 1楼网友:思契十里
  • 2021-01-17 04:09
应该是采用递归搜索吧,类似于N后问题。。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息