如何在Delphi中实现求某一集合的子集
设现有一属性集合A={a,b,c,d,e},如何用循环实现求A中包含i个属性的全体子集(i=1,2,3,4,5). 问题点数:50、回复次数:5Top
1 楼Eastunfail(龍子龍孫) (Serpent's Embrace)回复于 2005-08-18 17:50:03 得分 0
type TElement=(a,b,c,d,e);
TElements=set of TElement;
const
ElementName:array[TElement]of char=('a','b','c','d','e');
function ElementsToStr(Elements:TElements):string;
var i:TElement;
begin
Result:='';
for i:=low(TElement) to high(TElement) do
if i in Elements then Result:=Result+ElementName[i]+' ';
end;
var Elements:TElements;i:Integer;Data:byte absolute Elements;
begin
for i:=1 to (1 shl 5) do
begin
Data:=i;
Writeln(ElementsToStr(Elements));
end;
end.Top
2 楼Eastunfail(龍子龍孫) (Serpent's Embrace)回复于 2005-08-18 17:52:32 得分 0
更加难懂一点就把ElementsToStr改为:
function ElementsToStr(Elements:TElements):string;
var i:TElement;
begin
Result:='';
for i in [a..e] do
if i in Elements then Result:=Result+ElementName[i]+' ';
end;
呵呵Top
3 楼shusure()回复于 2005-08-19 10:27:02 得分 30
Eastunfail:你好!谢谢你的回复。我的问题可能提得不够清楚。
我想实现下述功能:
属性集合A={a,b,c,d,e},我想得到包含i个属性的子集,(i=1..5)
即:1个属性{a},{b},{c},{d},{e};
2个属性{a,b},{a,c},{a,d},{a,e},{b,c},{b,d},{b,e},{c,d},{c,e},{d,e};
3个属性{a,b,c},{a,b,d},{a,b,e},{b,c,d},{b,c,e},{c,d,e};
4个属性{a,b,c,d},{a,b,c,e},{b,c,d,e};
5个属性{a,b,c,d,e}.
且用一个string型变量str来存放包含i个属性的子集,最外层循环用变量i来控制。Top
4 楼Eastunfail(龍子龍孫) (Serpent's Embrace)回复于 2005-08-19 11:13:30 得分 20
从原来的代码改的,效率低了点:
type TElement=(a,b,c,d,e);
TElements=set of TElement;
const
ElementName:array[TElement]of char=('a','b','c','d','e');
function ElementsToStr(Elements:TElements):string;
var i:TElement;
begin
Result:='';
for i in [a..e] do
if i in Elements then Result:=Result+ElementName[i]+' ';
end;
function GetSize(int:byte):Integer;
var i:Integer;
begin
Result:=0;
for i:=0 to 7 do
begin
if ((1 shl i) and int)<>0 then
Inc(Result);
end;
end;
function GetElements(Size:Integer):String;
var Elements:TElements;i:Integer;Data:byte absolute Elements;
begin
Result:='';
for i:=1 to (1 shl 5)-1 do
begin
Data:=i;
if GetSize(Data)=Size then
Result:=Result+'{'+TrimRight(ElementsToStr(Elements))+'} ';
end;
end;
begin
Writeln(GetElements(1));
Writeln(GetElements(2));
Writeln(GetElements(3));
Writeln(GetElements(4));
Writeln(GetElements(5));
end.Top
5 楼zyp2005(zyp1982)回复于 2005-08-23 15:54:22 得分 0
虽然这个问题我自己已经解决了,但仍然很感谢大家,再此给各位高手撒分了Top




