阶乘的长度

时间:2018-03-19 21:42:30

标签: python-3.x

我尝试运行以下程序:

from functools import lru_cache
@lru_cache(Maxsize = None)

def count(n):
    factorial_num = 1
    num_digits = 0
    if n == 1:
       factorial_num = 1
    else:
        factorial_num = n * count(n-1)
    return len(str(factorial_num))

然而,它并没有像我预期的那样给出了阶乘数的长度。

我还想使用代码在数十亿的范围内找到非常大的数字的阶乘,并尝试使用lru_cache。但是,没有运气。

2 个答案:

答案 0 :(得分:1)

阿齐兹在评论中指出,你的递归案例是错误的。

factorial_num = n * count(n-1)

如果count(n-1)实际返回(n-1)!这会有用,但事实并非如此,因为你试图返回数字计数。

>>> count(1)
1    # Base case is correct.
>>> count(2)
1    # 2 * count(1) = 2 * 1 = 2.  Whose *length* is 1 digit.
>>> count(9)
1    # For all single-digit n, count(n) is still 1.
>>> count(10)
2    # 10 * count(9) = 10 * 1 = 10.  Whose *length* is 2 digits.

你应该编写一个计算阶乘的函数,而不是试图将这个逻辑与数字计数混合。

@lru_cache(maxsize=None)
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

请注意,最新版本的Python具有内置math.factorial功能,如果您的教师不要求您推送自己的阶乘代码,则可以使用该功能。

然后,您只需使用len(str(factorial(n)))来计算数字。

答案 1 :(得分:0)

您可以使用Kamenetsky公式返回n中的位数!

对于次要数字,请使用:

def findDigits(n): 

    if (n < 0): 
        return 0; 

    if (n <= 1): 
        return 1; 

    digits = 0; 
    for i in range(2, n + 1): 
        digits += math.log10(i); 

    return math.floor(digits) + 1; 

使用更大的数字:

def findDigits(n): 

    if (n < 0): 
        return 0; 

    if (n <= 1): 
        return 1; 

    x = ((n * math.log10(n / math.e) + 
              math.log10(2 * math.pi * n) /2.0)); 

    return math.floor(x) + 1; 

来源:https://www.geeksforgeeks.org/count-digits-factorial-set-1/?ref=lbphttps://www.geeksforgeeks.org/count-digits-factorial-set-2/?ref=lbp