香港电视剧贴错门神:PASCAL高手进来,求助,有分拿呀

来源:百度文库 编辑:高校问答 时间:2024/04/29 15:19:01
对于集合N={1,2,3,…n}的所以子集可象字典一样进行排序:如当n=3时
子集排序如下:
空集
{1}
{1,2}
{1,2,3}
{1,3}
{2}
{2,3}
{3}
当n=4时排序如下:
空集
{1}
{1,2}
{1,2,3}
{1,2,3,4}
{1,2,4}
{1,3,}
{1,3,4}
{1,4}
{2}
{2,3}
{2,3,4}
{2,4}
{3}
{3,4}
{4}
你的任务是对任意的n(1< n< = 31)及k(k<2^n),求出第k小的子集。

Input

只有一行n和k用空格隔开。

Output

仅一行,是该子集的元素,由小到大排列,用空格隔开,空集输出0。

Sample Input

输入样例1:
3 4
输入样例2:
4 10

Sample Output

输出样例1:
1 2 3
输出样例2:
2

我用DELPHI写的也是PASCAL语法,你看看,以下是代码实现部分其它部分省略
procedure TForm1.Button1Click(Sender: TObject);
var
a,i,m,n,k:integer;
s:string; //声明变量
begin
n:=strtoint(edit1.Text);
k:=strtoint(edit2.Text); //输入n、k,但是没有效验n(1< n< = 31)及k(k<2^n),请自己添加。
k:=k-1;
if k=0 then//如果为0则输出0,并退出过程
begin
memo1.Lines.Add('0');
exit;
end;//以下为算法实现部分
s:='';//将要输出的字符串
for i:=1 to n do//根据排序的规律得出字符串
begin
m:=1;
if k=0 then break;
for a:=1 to n-i do m:=m*2;
if k<=m then
begin
s:=s+inttostr(i)+' ';
k:=k-1;
end
else
begin
k:=k-m;
end;
end;
memo1.Lines.Add(s);//输出字符串
end;
哈哈哈,下面改成PASCAL了
var a,i,m,n,k:integer;
s,c:string;
begin
readln(n);
readln(k);
k:=k-1;
if k=0 then
begin
writeln(s);
exit;
end;
s:='';
for i:=1 to n do
begin
m:=1;
if k=0 then break;
for a:=1 to n-i do m:=m*2;
if k<=m then
begin
str(i,c);
s:=s+c+' ';
k:=k-1;
end
else
begin
k:=k-m;
end;
end;
writeln(s);
end.

var t,n,k:integer;
procedure dg(i,sl:integer;s:string);
var li:integer;
listr:string;
begin
t:=t+1;
if t=k then begin
writeln(s);
Exit;
end;
for li:=sl+1 to n do begin
str(li,listr);
dg(i+1,li,s+listr);
end;
end;
begin
t:=0;
readln(n);
readln(k);
dg(1,0,'');
end.
试着玩,不知道行不行

看不懂你说的

?????