如何从任意个数中抽取出任意个数的全部组合。(200分)

  • 主题发起人 主题发起人 yuleibo
  • 开始时间 开始时间
Y

yuleibo

Unregistered / Unconfirmed
GUEST, unregistred user!
如何从任意个数中抽取出任意个数的全部组合。
比如说 从 五 个数(1、2、3、4、5)中抽取三个数的全部组合。
有:123 124 125 234 245 等。
要全部的,并且不能出现象125 、 152 这样的重复号。
或者是抽取出四个数的组合。
 
呵呵,赶巧了,刚写过,贴份原码,递归和非递归的两种。
递归的:
//-------------------------------------------
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
procedure zhuhe(n,k:integer;str:string);
var
i:integer;
begin
if n = k then
begin
for i:=ndo
wnto 1do
str := inttostr(i) + ',' + str;
writeln(str);
exit;
end;
if k = 1 then
begin
for i:=1 to ndo
writeln(inttostr(i) + ',' + str);
exit;
end;
zhuhe(n-1,k,str);
zhuhe(n-1,k-1,inttostr(n) + ',' +str);
end;

begin
zhuhe(29,7,'');
readln;
end.

非递归;
//--------------------------------------------------------------
解二,非递归;要求选的数字大于1
type
TForm1 = class(TForm)
ListBox1: TListBox;//用于显示结果
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
const
m = 3;//随便改,只要m<=n
n = 5;
var sum : integer;//记录当前输出的是第几个答案
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j :integer;
p : array of integer;//指针数组,其内容为选取的数在s中的标号
//长度为m
s : array of integer;//源数组 长度为n
str : string;//输出结果暂存
begin
//初始化p
//此处缺m是否为1的判断,应加入;
setlength(p,m);
for i := 0 to m-1do
p:=i;
p[m-1] := p[m-2];
//改;
//初始化s
setlength(s,n);
for i := 0 to n-1do
s:=i;//此处的赋值,可根据你的需要
sum := 0;
while truedo
begin
inc(p[m-1]);
str :='';
//得到一个结果
for j:=0 to length(p)-1do
str := str+inttostr(S[p[j]])+',';
//output
listbox1.items.add('---------------');
inc(sum);
listbox1.items.add(inttostr(sum));
listbox1.items.add(str);
//如果所有指针都排到s之末尾,则找到所有解
//结束循化
if p[0]=(n-m) then
break;
//将指针往后移动
//以遍历所有的数
for i:=1 to m-1do
if p=n-(m-i) then
begin
p[i-1]:= p[i-1]+1;
for j:=i to m-2do
p[j] := p[j-1]+1;
p[m-1]:=p[m-2];
break;
end;
end;
//while
end;

保证可以用的,给分了。
 
看你的程序源代码,好象你刚才写过的是彩票的代码。

呵中了奖了没有 ?:)
 
对了,如何和你联系呀?

yuleibo@tytxy.com
OICQ:5008022
www.softdiy.com
我的联系方法。
 
有一个问题再问一下,两种方案。上面的不行,在我的机器上调试不好,后面的可以,不过是序号的,
实际上在解决问题的过程中,我要求的是字符串。当然这个我可以改。:)
和我联系。
 
这写都是原始的代码,忘改了,
把第一段中的writeln改为showmessage就可以。
ytsheep@etang.com,不能在论坛上问吗?
 

呵呵,我可从没买过彩票呀,
因为毕业设计赶的,还偷了点别人的代码。
不过这次设计做完,倒是可以改成做彩票预测的,
 
接受答案了.
 
后退
顶部