加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 给定值的基数为n的数字

发布时间:2020-12-15 09:20:39 所属栏目:大数据 来源:网络整理
导读:这是我用来从数字数组和基值生成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
这是我用来从数字数组和基值生成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值,如何为给定的基值(其中base> 1)生成ADigits数组?

2)如何确定代表给定UInt64值的给定基值(其中base> 1)的ADigits数组的长度?

解决方法

作为动态数组的函数实现…

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读