如果给定一个数3,如何依次输出(0,0,0),(0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1)?(

  • 主题发起人 主题发起人 ISY
  • 开始时间 开始时间
I

ISY

Unregistered / Unconfirmed
GUEST, unregistred user!
如果给定一个数3,如何依次输出(0,0,0),(0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1)?(45分)<br />2的n(n给定)次方如何计算(指是否有这个函数或者运算符,2^n?)?
n!(n+(n-1)+(n-2)+...+1)如何计算(指是否有这个函数或者运算符,(n!)?)?

如果给定一个数3,如何让k:Array[1..3] of Integer先为
(0,0,0),再为(0,0,1),(0,1,0),(0,1,1),(1,0,0),(1,0,1),(1,1,0),(1,1,1),
就是让j:=1 to 2^3 do 输出k[1],k[2],k[3]的二进制叠加?

如果指定n?
 
1.好像没有.
2.好象n!:=(n*(n-1)*(n-2)*...*1)吧,自己写.
3.这个问题很复杂,需要递归算法
4.如果指定n?不明白!
 
2的n次方,1 shl n;//?还是shr?忘了
for j:=1 to 2^3 do
begin
k[1]:=j div 4;//其实是j div 2^(n-1)
k[2]:=(j mod 4) div 2;
k[3]:=j mod 2;
end;
指定n的话你自己换一下
 
指定n就是指
n=2输出(0,0)(0,1)(1,0)(1,1)
n=3输出(0,0,0)(0,0,1)(0,1,0)(0,1,1)(1,0,0)(1,0,1)(1,1,0)(1,1,1)
n=4输出(0,0,0,0)(0,0,0,1)(0,0,1,0)(0,0,1,1)(0,1,0,0)(0,1,0,1)(0,1,1,0)(0,1,1,1)...
 
计算如2的N次方这样的。首先你要考虑你计算出来的最大数值有没有什么类型可表示。如果没有你应该定义一个链表来表示你要计算的数。如果有你应该限定N的最大值,这样才不会发生溢出
 
1 1 shl n
或 intpower(2,n)

2
function jc(n:integer):integer;
begin
if n<=1 then
result:=1
else
result:=n*jc(n-1);
end;

3

procedure TForm1.Button4Click(Sender: TObject);
var
i,j,n:integer;
s:string;
ss:TStrings;
begin
n:=3;
ss:=TStringList.Create ;
for i:=0 to (1 shl n)-1 do
begin
s:='(';
for j:=n-1 downto 0 do
begin
s:=s+inttostr((i shr j) and 1);
if j<>0 then s:=s+','
else s:=s+')';
end;
//showmessage(s);
ss.add(s);
end;
showmessage(ss.text);
ss.free;
end;
 
去查一查你算法语言的教材先
 
//------------{排列算法}{求指定字符串的所有不重复字母排列}---------------------------------------
FUNCTION FkPermuteListGetIS(vStr:STRING):TStringList;
VAR i,x:Integer
lTemp,lMain:TStringList;
{子函数...}
FUNCTION _InsertAnyPos(vStr1,vStr2:STRING):TStringList;
VAR i:Integer
sTemp: STRING;
BEGIN
Result := Tstringlist.create;
Result.add(vStr2+vStr1);
FOR i := 0 TO length(vStr2)-1 DO
BEGIN
sTemp:=Copy(vStr2,1,i)+vStr1+copy(vStr2,i+1,length(vStr2)-i);
Result.add(sTemp);
END;
END;
{END SUB}
BEGIN
Result:=TStringList.Create;
lTemp := Tstringlist.Create;
lMain := _InsertAnyPos(vStr[2], vStr[1]);
i := 2;
WHILE i <= length(vStr) DO
BEGIN
lTemp.Clear;
lTemp.Addstrings(lMain);
lMain.Clear;
inc(i);
FOR x := 0 TO lTemp.Count - 1 DO
BEGIN
lMain.Addstrings(_InsertAnyPos(vStr, lTemp[x]));
END;
END;
Result:=lTemp;
lMain.Free;
END;
//--------------------------------------------------------
这个没有指定n,现在比较忙,有空再写.
 
多人接受答案了。
 
后退
顶部