从1到n计算9 python优化

xriantvc  于 2023-01-08  发布在  Python
关注(0)|答案(1)|浏览(131)
def count_nines(n):
    x = list(map(str,range(n + 1)))
    count = 0
    for i in x:
        c = i.count('9')
        count += c 
    return count

执行超时(12000毫秒)
我如何优化这个代码?

mf98qq94

mf98qq941#

下面是基于我的评论的一些工作代码(我在一些不太大的数字上测试了它,它返回的结果与您的相同):

def count_nines(n):
    if n==0:
        return 0
    k = len(str(n))-1
    leading_digit, remainder = divmod(n, 10**k)  # Thanks @Stef for this optimization
    # Number of nines in numbers from 1 to leading_digit * 10**k - 1
    count1 = leading_digit * k*10**(k-1)
    # If the leading_digit is 9, number of times it appears
    # (in numbers from  9 * 10**k to n)
    count2 = remainder+1 if leading_digit==9 else 0
    # Number of nines in remainder
    count3 = count_nines(remainder)
    # Total number of nines
    return int(count1 + count2 + count3)

解释

  • 首先,1-10^k中的9(以下简称为c9())的个数为k * 10^(k-1);这很容易用递归来证明,但我还是举个例子来解释:假设c9(1000)= 300,则数字0xxx、1xxx...9xxx的xxx部分中的9的数目等于10 * 300;加上9xxx中9的个数为1000(从9000到9999),得到c9(10000)= 10*300 + 1000 = 4000。
  • 现在假设您需要c9(7935):你在数字1-7000中有7 * 300个9,然后在数字7000到7900中有9*20个9,然后在数字900到935中有36个前导9,然后...
    示例
count_nines(9254287593789050756)
Out[12]: 16880680640899572416

相关问题