繁体   English   中英

Python while 循环无法按预期工作

[英]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”

你为什么不费心做任何调试? 请参阅这个可爱的调试站点以获取帮助。 跟踪n简单print显示了问题。

您正在对整数进行float计算; 不能保证您返回的结果是准确的。 相反,使用

n = n // 10

乘以 0.1 后,您将得到一个浮点数。 使用大到 30 的数字将失去精度! 您想使用 // 除以 10。

此外,您无需查看字符串中的最后一位数字,而只需查看数字 mod 10。速度要快得多

在 python 中, intfloat上的*运算符输出一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM