阶乘和数就是比如: 145为1!+4!+5!,那么145就是阶乘和数。编程题目就是求1到1000内的阶乘和数.

解决方案 »

  1.   


    var
      Datas , OutDatas : array of integer;
      OutStringList : array of String;  //显示使用procedure ImulAll;
    var
      i , n , nCount : integer;
    begin
      n := 1;
      SetLength(Datas , Trunc(SQRT(1000)));
      nCount := 0;
      for i:=0 to High(Datas) do begin
        n := n * (i+1);
        if n>1000 then Break;
        Datas[i] := n;
        inc(nCount);
      end;
      SetLength(Datas , nCount);
    end;procedure GetNeedInt;
    Type
      T32BitSet = 0..31;
      T32BitSetOf = set of T32BitSet;
      P32BitSetOf = ^T32BitSetOf;
    var
      n , Sum , nInc : integer;
      i , D , k : integer;
      S : String;                  //显示使用
    begin
      n := Length(Datas);
      if n=0 then exit;
      D := $FFFFFFFF SHR (32 - n);
      for i:=1 to D do begin
        Sum := 0;
        nInc := 0;
        S := '';             //显示使用
        for k:=0 to n-1 do begin
          if k in P32BitSetOf(@i)^ then begin
            Sum := Sum + Datas[k];
            inc(nInc);
            S := S + IntToStr(k+1) + '! + ';   //显示使用
          end;
        end;
        if (nInc>=2) then begin
          SetLength(OutDatas , Length(OutDatas)+1);
          OutDatas[High(OutDatas)] := Sum;
          SetLength(OutStringList , Length(OutStringList)+1);  //显示使用
          OutStringList[High(OutStringList)] := Copy(S , 1 , Length(S) - 2); //显示使用
        end;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
      i : integer;
    begin
      ImulAll;
      GetNeedInt;
      for i:=0 to High(OutDatas) do
        Memo2.Lines.Add(IntToStr(OutDatas[i]) + '=' + OutStringList[i]);
    end;
      

  2.   

    kiboisme今天做题好生猛,赞一个!
      

  3.   


    我也是在C区看到的。楼主也是放了鸽子了。
    http://topic.csdn.net/u/20120301/12/2a9f54d0-6d2b-498e-8c97-770ffcc46a8d.html
    看看我的PASCAL代码
    function fib(n:Integer):Integer;
    begin
      if n>=1 then
        result :=fib(n-1)*n
      else
        Result :=1;
    end;function nfib(n:Integer):Integer;
    begin
      if n>=10 then
        Result :=nfib(n div 10)+fib(n mod 10)
      else
        Result :=fib(n);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      i: Integer;
    begin
      Memo1.Lines.Clear;
      for i := 1 to 1000 do
        if nfib(i)=i then
          Memo1.Lines.Add(IntToStr(i));
    end;end.