4

これは、数字の配列とベース値から UInt64 の結果を生成するために使用する関数です。

function BaseNToInteger(const ABase: Cardinal; const ADigits: Array of Byte): UInt64;
var
  i: Integer;
begin
  Result := 0;
  for i := 0 to (Length(ADigits) - 1) do begin
    Result := Result + (ADigits[i] * Power(i, ABase));
  end;
end;

[Power() 関数については心配しないでください。カーディナルを使用して UInt64 の結果を生成する独自のコードを作成しました。]

これは簡単な部分です。

私の数学のスキルは長年にわたって錆びているように見えるので、私が苦労している難しい部分は次のとおりです。

1) 特定の UInt64 値に対して、特定のベース値 (ベースが > 1) の ADigits 配列を生成するにはどうすればよいですか?

2) 特定の UInt64 値を表す特定のベース値 (ベースが > 1 の場合) の ADigits 配列の長さを決定するにはどうすればよいですか?

4

2 に答える 2

4

動的配列を使用した関数としての実装 ...

uses math;

type
  TDigits = Array of Byte;    

Function BaseNToInteger(const Digits: TDigits; Base: Integer): Cardinal;
var
  i: integer;
begin
  Result := 0;
  for i := High(Digits) DownTo Low(Digits) do
    Result := Base * Result + Digits[i];
end;

Function IntegerToBaseN(Nr: Cardinal; Base: Integer): TDigits;
var
  i: integer;
  function CeilAllways(const X: Extended): Integer;
  begin
    Result := Integer(Trunc(X));
    if Frac(X) >= 0 then
      Inc(Result);
  end;    
begin
  SetLength(Result, CeilAllways(ln(Nr) / ln(Base)));
  for i := Low(Result) to High(Result) do
  begin
    Result[i] := Nr mod Base;
    Nr := Nr div Base;
  end;
end;
于 2013-05-12T21:31:43.887 に答える