帮我组合一下123456 ( 积分: 50 )

  • 主题发起人 主题发起人 anchony
  • 开始时间 开始时间
A

anchony

Unregistered / Unconfirmed
GUEST, unregistred user!
有字符串'123456'
求一算法把它变成,看用两个循环能不能实现
123
124
125
126
134
135
136
145
146
156
234
235
236
...................直到
456
 
这个算法其实就是从1234566个字符中,取3个组成三位数数字,
一个比较简单的算法可以按下面这样做。
I,j; integer
CurNum,AllNum:String;
Result:TStringList;
Result:=TStringList.create;
for I:=100 to 999 do (当然改成从123 to 456也可以)
begin
AllNum:='123456';
CurNum:=IntToStr(i);
AllNum[StrToInt(CurNum[1])] := ' ';
if AllNum[StrToInt(CurNum[2])] <> ' ' then
AllNum[StrToInt(CurNum[2])] := ' '
else
Continue;
if AllNum[StrToInt(CurNum[3])] <> ' ' then
AllNum[StrToInt(CurNum[3])] := ' '
else
Continue;
result.add(CurNum);
end;
ShowMessage(Result.text);

就是检测组成的序列中的每一位是否已经在123456中出现过,并且只出现一次,那么就对了,否则就不符。

还有一个算法,就是从123456中依次取3个数,对解决这个特定的问题来说,有点复杂。
 
procedure TForm1.Button2Click(Sender: TObject);
var
v1: TStringList;
tail, mid, head: Integer;
I: Integer;
begin
v1 := TStringList.Create;
v1.Delimiter := ',';
v1.DelimitedText := '1,2,3,4,5,6';

head := 0;
mid := head + 1;
tail := mid + 1;
Memo1.Clear;

while mid + 1 < v1.Count do
begin
while mid + 1 < v1.Count do
begin
while tail < v1.Count do
begin
Memo1.Lines.Add(v1.Strings[head] + v1.Strings[mid] + v1.Strings[tail]);
tail := tail + 1;
end;
mid := mid + 1;
tail := mid + 1;
end;
head := head + 1;
mid := head + 1;
tail := mid + 1;
Memo1.Lines.Add('');
end;

v1.Free;
end;
 
指定范围的不科学了,这个字符是有可能是其它的字符的啦
 
感觉楼主的要求只是按位次取数据
 
最近好象很多组合问题
procedure GetList(const S: string; Strs: TStrings);
var
I, J, K: Integer;
begin
Strs.Clear;
for I := 1 to Length(S) do
for J := I + 1 to Length(S) do
for K := J + 1 to Length(S) do
Strs.Add(S + S[J] + S[K]);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
GetList('123456', ListBox1.Items);
end;
 
for i := 1 to 6
for j := 2 to 6
for k := 3 to 6
输入数据在这种情况下 i <> j j<> k i <> k
 
循环太多了,字符如果太长,这个过程就没有效率了,用两个循环能实现吗?
 
照我的算法一个循环不就实现了吗?
虽然你举得例子是123456中取3位组成三位数字,但实际应用的时候,并不需要一定是数字。
我上面的算法,先是实现了由1-6组成的无重复位置的3位数,把这三位数代表的数字再转换成对应位置的字符,就可以实现任易的组合
比如说求'SDFEWT'的组合,则 123=SDF 356=FWT,同样可以实现
 
//改写 levi 的代码 测试通过
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons;

type
TForm1 = class(TForm)
Memo1: TMemo;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }

public
{ Public declarations }
end;
Procedure assemble(var Ret:TStrings);
var
Form1: TForm1;

implementation

{$R *.dfm}

Procedure assemble(var Ret:TStrings);
var
i,j,l,p,k:integer;
CurNum,AllNum:String;
begin
for I:=123 to 456 do
begin
AllNum:='123456';
CurNum:=IntToStr(i); //123

if pos(CurNum[2],AllNum) =0 then continue;
if pos(CurNum[3],AllNum) =0 then continue;
AllNum[StrToInt(CurNum[1])] := ' ';
if AllNum[StrToInt(CurNum[2])] <> ' ' then
AllNum[StrToInt(CurNum[2])] := ' '
else
Continue;
if AllNum[StrToInt(CurNum[3])] <> ' ' then
AllNum[StrToInt(CurNum[3])] := ' '
else
Continue;
Ret.add(CurNum);

end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Ret:TStrings;
begin
Ret:=TStringList.Create;
assemble(Ret);
Memo1.Lines := Ret;
end;

end.
 
如果有其他字符可以采用替换或者利用字符串索引来转化
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
763
import
I
I
回复
0
查看
418
import
I
后退
顶部