回 帖 发 新 帖 刷新版面

主题:关于拆分的一道题目

任何一个大于1的自然数,总可以拆分成若干个小于N的自然数之和.
例:N:3
3=1+2
3=1+1+1

具体应怎么做,望赐教,本人不才!

回复列表 (共2个回复)

沙发

递归.
func d(n,t:int):long.
  i:int
  m:long
{
  if n=1 then m=1 else {
    m=0
    for i=1->t if i<=n div 2 then m+=d(n-i,i)
  }
}

板凳

var
i,n,p,an:integer;
s:array[1..100] of integer;
begin
  readln(n);
  s[1]:=1; p:=1; an:=1;
  while p>0 do
    begin
      while an<n do begin p:=p+1; s[p]:=s[p-1]; an:=an+s[p]; end;
      if an=n then
        begin
          for i:=1 to p do write(s[i],' ');
          writeln;
        end;
      an:=an-s[p]; p:=p-1;
      while (p>0)and(s[p]=n-1) do begin an:=an-s[p]; p:=p-1; end;
      if p>0 then begin an:=an+1; s[p]:=s[p]+1; end;
    end;
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册