我尝试运行以下程序:
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
。但是,没有运气。
答案 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=lbp和https://www.geeksforgeeks.org/count-digits-factorial-set-2/?ref=lbp