[英]Python while loop not working as intended
我不知道如何用 while 循环解决这个问题。 所以基本上我想在一个数字的阶乘末尾返回零的数量。
import math
def zeros(n):
total_zero = 0
n = math.factorial(n)
while str(n)[-1] == '0': # to check if the last number is 0 or not
n = n * 0.1
total_zero += 1
return total_zero
output = zeros(30)
print(output)
while 循环只运行了 1 次后就中断了; 我不知道为什么。
帮助将不胜感激。 谢谢!
将您的值乘以0.1
它变成一个float
,它的字符串表示变成科学记数法2.6525285981219107e+31
,它不以1
结尾
你最好将整数除以 10 以保持一个int
def zeros(n):
total_zero = 0
n = math.factorial(n)
while str(n)[-1] == '0': # to check if the last number is 0 or not
n = n // 10
total_zero += 1
print(f"testting {str(n)}")
return total_zero
>> zeros(30)
testting 26525285981219105863630848000000
testting 2652528598121910586363084800000
testting 265252859812191058636308480000
testting 26525285981219105863630848000
testting 2652528598121910586363084800
testting 265252859812191058636308480
testting 26525285981219105863630848
7
更好您还可以使用str.rstrip
:您删除前导零并检查长度差异
def zeros(n):
value = str(math.factorial(n))
return len(value) - len(value.rstrip("0"))
我上面的第一个答案是从字面上解决用户提出的问题:“为什么我的代码不起作用?” 但是有一种更简单的方法可以解决“n 有多少个零!最后”这个问题,它非常简单,您可以在脑海中进行数学计算。
看看任意数f
的质因数分解。 要在数字末尾得到“0”,质因数分解中必须有 2 x 5。 所以 f 末尾的零的数量只是质因数分解中 2 的数量和 5 的数量中的最小值。 对于阶乘,2 的因数总是多于 5 的因数,所以我们的问题是:n 的质因数分解中有多少个 5!
这很容易! 勒让德的公式说它是: floor(n/5) + floor(n/25) + floor(n/125) + ...
虽然这是一个无限级数,但经过几项后,它们都为零。 对于 30!,你得到6 + 1 + 0 + 0 + ... = 7
。
如果问 1000! 的末尾有多少个 0,答案是“200 + 40 + 8 + 1 = 249”
乘以 0.1 后,您将得到一个浮点数。 使用大到 30 的数字将失去精度! 您想使用 // 除以 10。
此外,您无需查看字符串中的最后一位数字,而只需查看数字 mod 10。速度要快得多
在 python 中, int
和float
上的*
运算符输出一个float
。 转换为str
会将长浮点数转换为科学记数法。 因此,在您的第二次迭代中,您有:
> str(math.factorial(30)*.1)
'2.6525285981219107e+31'
> str(math.factorial(30)*.1)[-1]
'1'
由于math.factorial
总是返回一个int
,它str
转换为完整整数值的字符串,您可以尝试首先将math.factorial
的输出转换为字符串,然后通过该字符串向后迭代。 就像是:
def count_zeros(n):
count = 0
n = str(math.factorial(n))
while n[-1] == '0':
count += 1
n = n[:-1]
return count
这可以更紧凑地解决如下
from math import factorial
from itertools import takewhile
def zeros(n):
return sum(1 for _ in takewhile(lambda i: i == '0', reversed(str(factorial(n)))))
例如
>>> zeros(30)
7
这基本上计算阶乘,将其转换为字符串,然后从字符串向后计算'0'
字符,直到遇到非零字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.