以下是我用来从数字和基数值数组中生成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