200分求解,好几个看了我这个题目都说简单,但又没能给出答案!(100分)

  • 主题发起人 主题发起人 SP229
  • 开始时间 开始时间
S

SP229

Unregistered / Unconfirmed
GUEST, unregistred user!
如题很多朋友看了都说简单,我搞不定.现在加分了
我在这个地址http://www.delphibbs.com/delphibbs/dispq.asp?lid=3881964
还有100分,能答的全给他了!!!
请看这个字符列表:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 5
1 2 4
1 2 4 5
1 2 5
1 3
1 3 4
1 3 4 5
1 3 5
1 4
1 4 5
1 5
2
2 3
2 3 4
2 3 4 5
2 3 5
2 4
2 4 5
2 5
3
3 4
3 4 5
3 5
4
4 5
5
以上是通过下面这段代码得到的
procedure TForm1.Button2Click(Sender: TObject);
const
MAX_NUM = 5;
var
nNum: array[0..MAX_NUM] of Integer;
i, j: Integer;
sNum: string;
begin
for i:= 0 to MAX_NUMdo
nNum:= 0;
i := 1;
while i > 0 do
begin
if nNum = 0 then
nNum:= nNum[i-1] + 1 else
Inc(nNum);
if nNum <= MAX_NUM then
begin
sNum:= '';
for j:= 1 to i do
sNum := sNum + IntToStr(nNum[j]) + ' ';
for j:= i + 1 to MAX_NUM do
nNum[j] := 0;
Memo1.Lines.Add(sNum);
Inc(i);
end else
Dec(i);
end;
end;

要求把上面的代码改成下面的函数.
function GetStrings(Strings:TStrings;
L: Integer):TStrings;得到
说明Strings,就是nNum: array[0..MAX_NUM]中的元素
MAX_NUM=Strings.Count
 
function GetStrings(Strings:TStrings;
L: Integer):TStrings;
L是什么?
tstrings;是一个对象,作为参数的话只是一个地址。
你在函数内部对strings改变,
那外部也会改变啊。
如果result:=strings,那实质就是外部的地址,
memo和tstrings不是同一类,传递参数也会有问题。
不如该成这样
function GetStrings(Strings:TStrings;
L: Integer):String;
var
MAX_NUM :integer;
nNum: array of Integer;
i, j: Integer;
sNum: string;
begin
MAX_NUM:=Strings.Count;
setlength(nNum,MAX_NUM+1);
for i:= 0 to MAX_NUMdo
nNum:= 0;
i := 1;
while i > 0 do
begin
if nNum = 0 then
nNum:= nNum[i-1] + 1 else
Inc(nNum);
if nNum <= MAX_NUM then
begin
sNum:= '';
for j:= 1 to i do
sNum := sNum + IntToStr(nNum[j]) + ' ';
for j:= i + 1 to MAX_NUM do
nNum[j] := 0;
result:=result+$d$a+sNum;
Inc(i);
end else
Dec(i);
end;
end;
 
你一定要那样,也行
function GetStrings(Strings:TStrings;
L: Integer):TStrings;
var
MAX_NUM :integer;
nNum: array of Integer;
i, j: Integer;
sNum: string;
begin
MAX_NUM:=Strings.Count;
//注意这里
result:=result.create;////注意这里
setlength(nNum,MAX_NUM+1);////注意这里
for i:= 0 to MAX_NUMdo
nNum:= 0;
i := 1;
while i > 0 do
begin
if nNum = 0 then
nNum:= nNum[i-1] + 1 else
Inc(nNum);
if nNum <= MAX_NUM then
begin
sNum:= '';
for j:= 1 to i do
sNum := sNum + IntToStr(nNum[j]) + ' ';
for j:= i + 1 to MAX_NUM do
nNum[j] := 0;
result.Add(sNum);//注意这里
Inc(i);
end else
Dec(i);
end;
end;
我这机器没装delphi没调试。
 
同楼上一样,不太清楚你的意图:像下面那样?
function GetStrings(Strings:TStrings;
L: Integer):TStrings;
var
nNum:array of Integer;
i,j:Integer;
sNum:string;
begin
SetLength(nNum,L * sizeof(Integer));
for i:= 0 to Ldo
nNum:= 0;
i := 1;
while i > 0 do
begin
if nNum = 0 then
nNum:= nNum[i-1] + 1
else
Inc(nNum);
if nNum <= L then
begin
sNum:= '';
for j:= 1 to i do
sNum := sNum + IntToStr(nNum[j]) + ' ';
for j:= i + 1 to L do
nNum[j] := 0;
Strings.Add(sNum);
Inc(i);
end
else
Dec(i);
end;
Result := Strings;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Strings:TStrings;
begin
Strings := TStringList.Create;
try
Strings := GetStrings(Strings,10);
Memo1.Lines.Assign(Strings);
ShowMessage(IntToStr(Strings.Count));
finally
Strings.Free;
end;
end;
 
很简单,测试通过:
function GetStrsList: TStringList;
const
MAX_NUM = 5;
var
nNum: array[0..MAX_NUM] of Integer;
i, j: Integer;
sNum: string;
strs: TStringList;
begin
strs:= TStringList.Create;
strs.Clear;
for i:= 0 to MAX_NUMdo
nNum:= 0;
i := 1;
while i > 0 do
begin
if nNum = 0 then
nNum:= nNum[i-1] + 1 else
Inc(nNum);
if nNum <= MAX_NUM then
begin
sNum:= '';
for j:= 1 to i do
sNum := sNum + IntToStr(nNum[j]) + ' ';
for j:= i + 1 to MAX_NUM do
nNum[j] := 0;
Strs.Add(sNum);
Inc(i);
end else
Dec(i);
end;
result:=strs;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
strs: TStringList;
begin
strs:=GetStrsList;
try
Memo2.Lines:=strs;
finally
strs.Free;
end;
end;
 
刚才没说清楚:
如果Strings中的个数比较多时L就是来控制它的长度比如L=4
1 2 3 4 5 或者2 3 4 5 6 7....都不添加到Result中当然参数Strings中不一定是数字,长度也不一定是1,
比如
AS
BS
CD
45
那么通过上面的函数得到的结果
AS
AS BS
AS BS CD
AS BS CD 45
......
这个函数我搞不出来,上面的代码是在网上找的,只要能达前面的效果就可以,不一定非要象上面那样.
 
还是没说清楚。
比如
AS
BS
CD
45
那么通过上面的函数得到的结果
AS
AS BS
AS BS CD
AS BS CD 45
...... <-------------- 这里以下是什么?把规则说出来。
 
比如
AS
BS
CD
45
那么通过上面的函数得到的结果
AS
AS BS
AS BS CD
AS BS CD 45
...... <-------------- 这里以下是什么?把规则说出来。
BS CD
BS CD 45
CD 45
45
 
测试通过:
function GetStrings(Strings:TStrings;
L: Integer):TStrings;
var
i, j, k: integer;
str: string;
Strs: TStringList;
begin
Strs:= TStringList.Create;
for I := Strings.Count - 1do
wnto 0do
if Length(Strings)>L then
Strings.Delete(i);
for I := 0 to Strings.Count - 1do
begin
for J := I to Strings.Count - 1do
begin
str:='';
for K := I to Jdo
str := str+ Strings[k] + ' ';
Strs.Add(str);
end;
end;
result:=Strs;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
strs1,strs2: TStrings;
begin
strs1:=TStringList.Create;
Strs1.Clear;
Strs1.Add('AS');
Strs1.Add('BS');
Strs1.Add('CD');
Strs1.Add('45');
Strs2:=GetStrings(Strs1,4);
try
Memo2.Lines:=strs2;
finally
strs1.Free;
Strs2.Free;
end;
end;
 
to kaida
基本可以了,
还有一点点问题
比如再增加两行
AS
BS
CD
45
FG
YG
在结果中会有这样一行AS BS CD 45 FG YG这个串中六个元素参数L 就是控制这个元素的AS BS CD 45 可以BS CD 45 FG可以CD 45 FG YG可以.
如果L=3
那么AS BS CD 可以,BS CD 45或者45 FG YG
 
Function GetStrings(Strings:TStringList;
L:Integer):TStringList;
var i,j,Count,Max_Num:Integer;
s:String;
begin
Result := TStringList.Create;
try
if Strings.Count < L then
Max_Num := Strings.Count
else
Max_Num := L;
For i := 0 to Max_Num - 1do
begin
For j := i to Max_Num - 1do
begin
s := '';
Count := i;
while Count <= jdo
begin
s := s + Strings.Strings[Count] + ' ';
inc(Count);
end;
Result.Add(s);
end;
end;
except
Result.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Strings1,Strings2:TStringList;
begin
Strings1 := TStringList.Create;
try
Strings1.Add('a');
Strings1.Add('b');
Strings1.Add('c');
Strings2 := GetStrings(Strings1,3);
Memo1.Lines.Assign(Strings2);
finally
Strings1.Free;
Strings2.Free;
end;
end;
 
to xiaopei
你的和kaida一样的问题
 
function GetStrings(Strings:TStrings;
L: Integer):TStrings;
var
i, j, k: integer;
str: string;
Strs: TStringList;
begin
Strs:= TStringList.Create;
for I := 0 to Strings.Count - 1do
begin
for J := I to Strings.Count - 1do
begin
str:='';
if J-I >= L then
continue;
for K := I to Jdo
str := str+ Strings[k] + ' ';
Strs.Add(str);
end;
end;
result:=Strs;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
strs1,strs2: TStrings;
begin
strs1:=TStringList.Create;
Strs1.Clear;
Strs1.Add('AS');
Strs1.Add('BS');
Strs1.Add('CD');
Strs1.Add('45');
Strs1.Add('FG');
Strs1.Add('YG');
Strs2:=GetStrings(Strs1,4);
try
Memo2.Lines:=strs2;
finally
strs1.Free;
Strs2.Free;
end;
end;
 
Function GetStrings(Strings:TStringList;
L:Integer):TStringList;
var i,j,Count,Max_Num:Integer;
s:String;
begin
Result := TStringList.Create;
try
if Strings.Count < L then
Max_Num := Strings.Count
else
Max_Num := L;
For i := 0 to Strings.Count - 1do
begin
For j := i to Strings.Count - 1do
begin
s := '';
Count := i;
while Count <= jdo
begin
if j < Max_Num then
begin
s := s + Strings.Strings[Count] + ' ';
inc(Count);
end else
break;
end;
if j < Max_Num then
Result.Add(s)
else
break;
end;
inc(Max_Num);
end;
except
Result.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Strings1,Strings2:TStringList;
begin
Strings1 := TStringList.Create;
try
Strings1.Add('a');
Strings1.Add('b');
Strings1.Add('c');
Strings1.Add('d');
Strings1.Add('e');
Strings1.Add('f');
Strings2 := GetStrings(Strings1,3);
Memo1.Lines.Assign(Strings2);
finally
Strings1.Free;
Strings2.Free;
end;
end;
 
to kaida,xiaopei
可以了给你们各加分100分
xiaopei在这里领分http://www.delphibbs.com/delphibbs/dispq.asp?lid=3881964
 
后退
顶部