Python 求2^k以n开头的最小k

Python 求2^k以n开头的最小k,python,algorithm,decimal,Python,Algorithm,Decimal,给定一个正整数n≤107,我需要找到最小正整数k,这样2k的十进制表示从n的十进制表示开始 例如,如果n=12,那么k=7,因为27=128;如果n=134,则k=27,因为227=134217728;如果n=82,那么k=209,因为2209≈8.23×1062 如果不存在这样的k,我需要返回−一, 我甚至没有尝试用我不知道如何解决的公式来解决它,而是决定通过计算2到1000的所有幂,将它们放在一个列表中,然后找到以n开头的数字的索引来解决。代码是有效的,但是。。。它甚至没有通过系统中的第一次

给定一个正整数n≤107,我需要找到最小正整数k,这样2k的十进制表示从n的十进制表示开始

例如,如果n=12,那么k=7,因为27=128;如果n=134,则k=27,因为227=134217728;如果n=82,那么k=209,因为2209≈8.23×1062

如果不存在这样的k,我需要返回−一,

我甚至没有尝试用我不知道如何解决的公式来解决它,而是决定通过计算2到1000的所有幂,将它们放在一个列表中,然后找到以n开头的数字的索引来解决。代码是有效的,但是。。。它甚至没有通过系统中的第一次测试。我不知道为什么,因为它适用于上述示例。不管怎样,这是代码

def find_all():
    arr = []
    n = 1
    for i in range(1000):
        arr.append(str(n))
        n = n << 1
    return arr


n = str(n)
NOT_FOUND = True
#n = input()
arr = find_all()
for i in arr:
    if i.startswith(n):
        print(arr.index(i), n)
        NOT_FOUND = False
        break
if NOT_FOUND:
    print(-1, n)

有什么问题吗?

假设你想找到一个以123开头的2的幂

这相当于找到log102的倍数,其介于0.08990511143998和0.09342168516235之间,因为log10123=2.08990511143998和log10124=2.09342168516235

如果你用这种方式来构造问题,就没有必要计算2的巨大幂。你所需要的只是一点浮点运算

下面的代码工作得相当好,但当n接近107时,需要几秒钟才能生成答案:


您的代码正在为示例工作,但假设您使用的是诸如hackerrank之类的网站来测试您的代码,那么他们可能使用了更大的n,最多10000000个,这与您生成的前1000个数字不符。k可能远大于1000。这是问题的完整描述吗?对make'k'有什么限制吗?如何判断k是否不存在?数字是无限的?唯一的限制是n,从1到10^7。显然,k没有限制。没有说明如何确定k是否存在。除此之外的任何设置我都发现n最多为20000,k最多为70000+,因此您可能需要调整算法以适应更大的数字。
def power_of_2_with_prefix(n):
    # Find the minimum integer k such that the digits of 2^k
    # start with the digits of n
    from math import log10
    #
    # First deal with trivial cases
    assert type(n) is int
    if n == 1:
        return 0
    if n < 1:
        return -1
    #
    # Calculate mantissa range
    logmin = log10(n)
    logmax = log10(n+1)
    logmin -= int(logmin)
    logmax -= int(logmax)
    if logmax < logmin:
        logmax += 1
    #
    # Now find a power of 2 whose log10 mantissa lies in this range
    log2 = log10(2)
    # Make sure k is large enough to include all trailing zeros of n
    mink = log10(n) / log10(2)
    x = 1
    k = 0
    while not (logmin <= x < logmax and k >= mink):
        x += log2
        if x >= 1:
            x -= 1
        k += 1
    return k

assert power_of_2_with_prefix(0) == -1
assert power_of_2_with_prefix(1) == 0
assert power_of_2_with_prefix(2) == 1
assert power_of_2_with_prefix(4) == 2
assert power_of_2_with_prefix(40) == 12
assert power_of_2_with_prefix(28584) == 74715
assert power_of_2_with_prefix(28723) == 110057
assert power_of_2_with_prefix(9999999) == 38267831