排列组合问题,200分请教!(200分)

  • 主题发起人 主题发起人 hxd
  • 开始时间 开始时间
H

hxd

Unregistered / Unconfirmed
GUEST, unregistred user!
有表如下:
字段1 字段2 字段3
A + 1
B * 2
C - 3
D / 4
... .... ....
需得到另一表:
A+1
A+B
3*B+A
A/2+C*4.....
又需排除相同的值,如:A+A+A,2*A+A,3*A 三个值,只留3*A,分不够可再加.


 
看起来好难啊!
 
高手们都到哪去了?无解?????
 
字段一有16个记录,字段二只有+,-,*,/,字段三是1~10.
 
你想用sql实现还是什么别的意思?
 
to 磊:
只要能得到结果,什么方法都行!
 
解决问题还可多拿100分,
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1139800。
 
请你把题目说的明白点,可以给个例子说明一下么。
A+A+A,2*A+A,3*A存在表中,算是重复记录,那么,你的这个程序不是要
增加一个简单运算的语法分析器了?
还有你的第二张代数式表中的代数式是让机器自动生成么?又有什么规则要遵守的?
问题还是讲清楚些,这样,我们好讨论!
期待你的回答。
 
to 武昌鱼:
我是要用机器生成第二张表,此表的记录都是可供运算的代数式,因此,+A*B+3/、C*9-等等
都不应该出现。如果可能的话,我希望穷举运算结果不重复的代数式。
 
你的“....”非常令人担心,不知道会有什么运算规则,最多有多少长度的表达式。
如果没有,倒还是不难。
 
to DarwinZhang:
请看:>>字段一有16个记录,字段二只有+,-,*,/,字段三是1~10.
 
到底用什么规则组合?你的组合规则不清楚,比方a/2+c*4+b/2+c*4+a/2+c*4................
这样算不算组合的一种呢?如果算,这样一个表达式下去,组合无穷多呢!!!!!!!!!!!!!!!!!!!!
如果构成组合的成分个数一定。我的大概思路如下:
写个穷举函数getall,参数befsta为前面已经构成的句子成分。(句子由若干个词组成,-13也算一个词)
参数hasenum已经组合的词个数,参数tot一共要组合的词个数。
采用递归写这个函数,一开始判断是否已经穷举完,
穷举完则对这种结果运算,如果不在已有结果集则加入结果集合
若没有穷举完,继续对每个可以作为下一个词的词进行下一次穷举。

 
因为句子是你构成的,所以语法分析器是不必了。
算法应该不难。我以前写过类似东西,可惜源代码找不到了。
 
to 雪鹰:
或者应该预先设定参与运算的字段一和字段三的个数(7~9)?当然,要求至少有一个
字段一的值参与运算。
 
A*A; B*C; 1+1 可否出现?
既可否: 字段一+字段二+字段一
字段三+字段二+字段三
字段一+字段二+字段三 是否是最大最小元素?

请将规则说清楚!
另外: 可以考虑十六个变量的四则运算分析算法。
 
to DarwinZhang:
请看:>>要求至少有一个字段一的值参与运算。
另外: 十六(再加1~10?)个变量的四则运算分析算法是怎么回事(别骂....)?
 
当然,是没有现成的16个变量的四则运算法则,不过,可以象这样来考虑。
可以认为你是要生成一个多项式库,

我可以给你一个大概的算法:
先定义这样一个结构来表达最简多项式的形式:
type SimpleM=Array of Record
Num1:Integer; //代表多项式的分子,减关系用负号
Num2:Integer; //代表多项式的分母
VarN:Array [0..16-1] of Integer;//表示1到16个变量的次幂,倒数用负数次幂
end;
用文件或Array of SimpleM来保存多项式库

设化简多项式的函数定义为:SimpleMProc(S:String):SimpleM;
基本算法:
1:依次搜索S中被'+'或'-'号分隔开的子字符串ss,并将每找到一个ss用2的方法分析;
2:依次搜索ss中被'*'或'/'号分隔开的字符串s3,并将每找到一个s3用3的方法分析;
3:如果是变量(A~?)将其入VarN中;如果是数字信息则入Num1或Num2.

而将SimpleM转化成最简多项式无疑是非常方便的。

现在,来写主程序算法:
将字段一和三组合成一个字段四(包括:A...?,1...??)
因为必须有字段一的东西,
根据交换律,可以将它调整到最前面,但前面必须可以带-,或/号,为方便,
默认+,-,/可以作为单操作符号,法则: +A=A; -A=0-A; /A=1/A,用+,-,/生成新字段五
但到最用SimpleM转化出,这样,字段二需要有两个标记(指针)
1.初始化
2.如果字符串为空,则赋予下一个字段五和字段一的组合值,
否则,追加字段二和字段四的下一个值。
3.用SimpleMProc化简字符,并在多项式库中查找。
4.如果找不到则将其加入多项式库。
5.判断个指针情况并进行调整。
6.根据条件判断是跳到 2 还是向下。(如有长度条件也在此判断)
7.根据多项式库给出最后结果。

根据该算法,不难写出程序。
 
to DarwinZhang:
首先谢谢您对这个问题的关心。再要说的是:我很菜.....
如果您有时间的话,能否请您写出源码?我将另开贴奉送500分。当然,分数
是很虚无的东西,但我也仅能以此表达我对您的谢意......
 
这个程序肯定不止一百行,而且很不幸,我现在只能在网吧上网,所以无法给你源代码。
另外,这个算法也许不是最好的甚至可能有错误,可能需要进一步改进。
这个程序也不会非常大,肯定用不了一千行,
所以你自己尝试一下也不会很难,何况还可以锻炼一下呢!
我原来学习的时候尝试编写一千行左右的程序感觉进步很大,希望你能取得更大的进步。
另外,你可以参考一下Delphi6.0(两张光盘的)第二张的 TParser控件的源代码,写得不错。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部