以下是我用來從數字和基數值數組中生成UInt64結果的函數。給定值的基數n數字
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值,我怎麼產生ADigits陣列對於給定基值(基數> 1)?
2)如何確定ADigits數組對於給定基值(基數> 1)的長度,它將表示給定的UInt64值?
如果循環不需要電源以相反的順序(你只會相乘)。對於反向操作(整數到基數n),您將重複除以基數(其餘爲連續數字)。最大長度由ceiling(log(2^64-1)/ log(base))給出。最簡單的方法是一次性修復最大可能長度,即64(基數爲2)。 – 2013-05-12 20:36:32