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