如何计算不同基数中数字的位数?

How to count the number of digits in numbers in different bases?

我正在处理不同基数(基数 10、基数 8、基数 16 等)的数字。我正在尝试计算每个数字中的字符数。

例子

Number: ABCDEF

Number of digits: 6

我知道基于对数的方法,但我遇到了一些问题。

  1. This Python script 输出 1,000,000 中的 3,969 个数字未能正确计算位数。

  2. 我觉得用对数的方法可能比较慢

链接:


编辑: 当然我可以计算字符串的长度,但我最感兴趣的是,是否可以在不使用字符串约定的情况下进行计算 。我想知道仅知道 source-base 要转换为 .[=15 的基础就可以帮助实现的算法=]

Edit2: source-basebase-10要转换为的基数 可以是任何其他基数。


如何计算不同基数的数字位数?

如果我知道 base-10 中的数字,如何在不执行转换的情况下计算转换为 base-16(base-8 等)的同一数字中的位数?

注意:一些Python或C代码将不胜感激

我不确定我是否理解你的问题。当您说您的初始数字在基数 b1 中时,是否意味着您将其表示为基数 b1 中的字符串?也许您想构造一些 table 来告诉您基数 b1 中的哪个数字对应于 b2、b2^2、b2^3...,然后将您的数字与这些数字进行比较以查看它适合的位置。

否则我会选择你提到的算法,它可以很容易地应用于任何基础。

输入:您的整数 x,您要计算其中数字的基数 b2。

int number_of_digits (int x, int b2) {
    int n = 0;
    while (x >0) {
        x/=b2;
        n++;
    }
    return n;
}

这两种方法都只是 n 的线性。

EDIT :如果你想更快,你可以将其实现为二进制搜索。然后你可以得到 O(log(n)).

对数不应该很慢。您可以通过以下公式轻松计算任何底数的对数:logBaseN(x)=logBaseA(x)/logBaseA(N) - 您可以使用 ln(Base e = 2.718...) 或 logBase10 或任何您拥有的。所以你真的不需要一个程序,一个公式应该可以做到:

num_digets(N, base) = 1 + floor(log(N) / log(base))

其中 N 是您的号码,base 您希望该号码所在的基数。

有关更多说明,请查看此处: http://www.mathpath.org/concepts/Num/numdigits.htm

请注意您的 Python 代码中的 NumToStr() 函数不正确,因为您的基础中有一个差值,它应该是:

def NumToStr(num):
    str=''
    while num:
            str+=alpha[(num)%base]
            num=(num)/base
    return ''.join(list(reversed(str)))

请注意,检查此函数 returns 正确的结果会发现错误(例如,使用 alpha="0123456789")。

通过此修复,我们可以使用给定的公式获得正确的位数:

nDigits = int(ceil(log(nmb, base)))

except 用于底数的精确幂(base**0base**1base**2 等...)比应有的少一分。这可以通过将 forumla 稍微更改为:

来解决
nDigits = 1 + floor(log(nmb, base))

请注意,即使这对于某些输入似乎也失败了(例如,从 base-10 转换为 base-10 它错误地表示 1000 为 3 位数字,1000000 为 6 位数字)。这似乎是由于浮点数固有的不精确性,例如:

print floor(log(1000, 10))

输出 2 而不是预期的 3.

关于您提到的性能问题,在您完成 profiling/benchmarking 表明这是一个问题之前,我不会担心此类琐碎代码的性能问题。例如,对于 128 位数字,您的 "very slow" C 代码最多只需要 38 除以 10。如果您需要比这更好的性能,那么您会 运行 使用这里提到的任何简单方法来解决同样的问题。我能想到的最快的事情是使用查找 table 和线性插值的组合的自定义 log() 函数,但您必须注意结果精度。