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

Python 如何计算不同基数的数字的位数?,python,c,algorithm,base,Python,C,Algorithm,Base,我在处理不同基数的数字(基数10、基数8、基数16等)。我试图计算每个数字中的字符数 范例 编号:ABCDEF 位数:6 我知道基于对数的方法,但我面临一些问题 输出它无法正确计算1000000个数字中的3969个数字的位数 我认为使用对数的方法可能相当慢 链接: 必须非常慢(如果我有一个非常大的数字怎么办?)。它也不能处理不同基数的数字(例如,base-16) 没有被愚弄,因为OP只询问10号基地 编辑:我当然可以计算字符串的长度,但我最感兴趣的是,是否可以在不使用字符串约定的情

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

范例

编号:
ABCDEF

位数:6

我知道基于对数的方法,但我面临一些问题

  • 输出它无法正确计算1000000个数字中的3969个数字的位数

  • 我认为使用对数的方法可能相当慢

  • 链接:

    • 必须非常慢(如果我有一个非常大的数字怎么办?)。它也不能处理不同基数的数字(例如,base-16)

    • 没有被愚弄,因为OP只询问10号基地


    编辑:我当然可以计算字符串的长度,但我最感兴趣的是,是否可以在不使用字符串约定的情况下进行计算。我想知道一种算法,它可以帮助我们只知道源代码库和要转换的库

    Edit2:源库是base-10,要转换为的库可以是任何其他库


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

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


    注意:一些Python或C代码将非常感谢

    我不确定我是否理解您的问题。当你说你的初始数字在b1底,这是否意味着你在b1底有一个字符串表示?也许你想构造一个表格,告诉你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中都是线性的


    编辑:如果您想更快,可以将其实现为二进制搜索。然后你可以得到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
    是您想要输入该号码的基数

    有关更多说明,请参见此处:

    请注意,Python代码中的
    numtost()
    函数是不正确的,这是由于您的基函数中的off-by-one导致的,它应该是:

    def NumToStr(num):
        str=''
        while num:
                str+=alpha[(num)%base]
                num=(num)/base
        return ''.join(list(reversed(str)))
    
    请注意,检查此函数是否返回正确的结果可能会发现错误(例如,使用
    alpha=“0123456789”

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

    nDigits = int(ceil(log(nmb, base)))
    
    除了基数的精确幂(
    base**0
    base**1
    base**2
    ,等等…)外,该基数正好比它应该的值小一倍。可通过将forumla稍微更改为:

    nDigits = 1 + floor(log(nmb, base))
    
    请注意,即使对于某些输入,这似乎也失败了(例如,从base-10转换为base-10时,它错误地表示1000为3位,1000000为6位)。这似乎是由于浮点数的固有精度不高所致,例如:

    print floor(log(1000, 10))
    
    输出
    2
    ,而不是预期的
    3


    关于您提到的性能,我不会担心这些琐碎代码的性能问题,除非您完成了分析/基准测试,表明这是一个问题。例如,对于一个128位的数字,“非常慢”的C代码最多只需要38个除法乘以10。如果您需要比这更好的性能,那么使用这里提到的任何简单方法都会遇到同样的问题。我能想到的最快的事情是使用查找表和线性插值组合的自定义
    log()
    函数,但你必须小心结果的精度。

    在给你写一个完整的答案之前,先想一想,这样的方法是否能满足您的要求:找到所需的幂n,例如16^n>您的_number>16^n,因为数字应该是n……您是在问我们如何调试您的Python脚本吗?@EmmanuelJay,我认为任何足够快的方法都适合。@abarnert,不,我想我自己可以处理这个问题。这个脚本是用来测试使用对数的方法的。@vib,哦,是的,我忘了提到
    source\u base
    是base-10,哎呀,现在正在编辑…谷歌设法对我隐藏了这个链接,现在就要调查了,谢谢。我想n=0将是一个特例?@MattiasWadman是的,当然。这将是所有基础中的
    1
    。如果负数对您来说是一个问题,您还需要注意负数(并确定在您的情况下合理的返回值是什么-对于
    N
    -N
    ,数字的数量将是相同的,但是对于显示,您可能需要为
    -
    添加一个额外的字符)。