排列组合的C算法实现

h13bk 2003-09-29 06:05:55
表达很简单:
设b为排列,c为组合
b(2,1,3)表示顺序取2,1,3,c(1,2,3)表示不论顺序将1,2,3取出来
那么复杂一点:
c(c(1,5),b(2,3),c(4,6))
b(b(1,c(2,3)),b(4,c(5,6,7)))之类的,如果入口参数就是这个字符串,我自己的代码总觉得效率不好,不知各位有没有效率高一点的C算法实现?(分不够可再加)
...全文
254 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangjuliang 2003-09-30
  • 打赏
  • 举报
回复
To jiangchun_xn(如果能再遇到你)
我不是说了嘛,是csdn里的嘛!
yhz 2003-09-30
  • 打赏
  • 举报
回复
你这个要求有点像解释执行代码。
建议你去看看编译原理这方面的资料。
尤其是文法、词法、语法的分析等等这方面的资料。

大体的思路是:
首先要对输入的字符串进行文法分析,得到一个中间代码结构,
然后再进行你所需要的操作。

至于你说到的效率问题,很可能是在文法,词法,语法分析阶段,
算法没有很好的优化造成的。具体的算法优化可能还要参考一下相关的资料。
jiangchun_xn 2003-09-30
  • 打赏
  • 举报
回复
huangjuliang():这段程序我怎么这么熟悉呢??
我不懂电脑 2003-09-30
  • 打赏
  • 举报
回复
水平考试的书上有例子
yesry 2003-09-30
  • 打赏
  • 举报
回复
排列比较容易实现。组合比较困难。

还有速度的问题。
yumibangzi 2003-09-30
  • 打赏
  • 举报
回复
h13bk 2003-09-30
  • 打赏
  • 举报
回复
不好意思,看来你误会我的意思了,你的程序是把所有可能的排列显示出来,但现在的问题是把一个排列组合的表达式解析出来
jeremylwz 2003-09-29
  • 打赏
  • 举报
回复
huangjuliang 2003-09-29
  • 打赏
  • 举报
回复
接分了!
huangjuliang 2003-09-29
  • 打赏
  • 举报
回复
void m(int s[],int depth,int maxvalue,int maxlength)
{
int i;
bool found;
if(depth==maxlength)
{
Form1->Label1->Caption="";
for(i=0;i<maxlength;i++)
Form1->Label1->Caption=Form1->Label1->Caption+s[i];
ShowMessage("一个结果");
return;
}
for(s[depth]=0;s[depth]<maxvalue;s[depth]++)
{
found=false;
for(i=0;i<depth;i++)
if(s[i]==s[depth])
{
found=true;
break;
}
if(!found)m(s,depth+1,maxvalue,maxlength);
}
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int *s;
int n;
n=5;
s=new int[n];//多少个
memset(s,0,sizeof(int)* n);
m(s,0,5,5);
delete s;
}

你看怎么样?
这些csdn里都有的!

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧