Python while循环未按预期工作

Python while循环未按预期工作,python,math,while-loop,Python,Math,While Loop,我不知道如何克服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_

我不知道如何克服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次后,它将中断;我不知道为什么


非常感谢您的帮助。谢谢

你为什么不费心去调试呢?请看这个以寻求帮助。跟踪n的简单打印显示了问题

你在对一个整数进行浮点运算;你得到的结果是准确的。相反,使用

n = n // 10

你为什么不费心去调试呢?请看这个以寻求帮助。跟踪n的简单打印显示了问题

你在对一个整数进行浮点运算;你得到的结果是准确的。相反,使用

n = n // 10

将你的值乘以0.1后,它变成了一个浮点数,它的字符串表示形式变成了科学符号2.6525285981219107e+31,它不以1结尾

你最好把整数除以10以保持整数

最好还可以使用str.rstrip:删除前导零并检查长度差

def zeros(n):
    value = str(math.factorial(n))
    return len(value) - len(value.rstrip("0"))

将你的值乘以0.1后,它变成了一个浮点数,它的字符串表示形式变成了科学符号2.6525285981219107e+31,它不以1结尾

你最好把整数除以10以保持整数

最好还可以使用str.rstrip:删除前导零并检查长度差

def zeros(n):
    value = str(math.factorial(n))
    return len(value) - len(value.rstrip("0"))

这个问题可以更简洁地解决,如下所示

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”字符,直到它遇到非零字符。

这可以更简洁地解决,如下所示

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”字符,直到遇到非零字符。

乘以.1后,就有了一个浮点数。如果数字大到30,您将失去精度!您想使用//除以10


另外,您可以只查看mod 10的数字,而不必查看字符串中的最后一个数字。快得多

在乘以.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
在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

我在上面的第一个答案是从字面上解决了用户提出的问题:为什么我的代码不能工作?但是有一个简单得多的方法来解决n有多少个零!最后是一个非常简单的例子,你可以在脑子里算算

看看任意数f的素因式分解。要在一个数字的末尾得到一个0,在素数分解中必须有2 x 5。因此,f末尾的零的个数就是素数分解中2s个数和5s个数的最小值。对于阶乘,2的因子总是比5的因子多,所以我们的问题是:在n的素阶乘中有多少个5

那很容易!他说: 地板/5+地板/25+地板/125+。。。 虽然这是一个无穷级数,经过几个项,它们都是零。30英镑!,你得到6+1+0+0+…=七,


如果被问及1000结尾处有多少个0!,答案是‘200+40+8+1=249’

我上面的第一个答案就是解决了用户提出的问题:为什么我的代码不能工作?但是有一个简单得多的方法来解决n有多少个零!最后是一个非常简单的例子,你可以在脑子里算算

看看任意数f的素因式分解。要在一个数字的末尾得到一个0,在素数分解中必须有2 x 5。因此,f末尾的零的个数就是素数分解中2s个数和5s个数的最小值。对于阶乘,2的因子总是比5的因子多,所以我们现在的问题是:pri中有多少个5 n的me分解

那很容易!他说: 地板/5+地板/25+地板/125+。。。 虽然这是一个无穷级数,经过几个项,它们都是零。30英镑!,你得到6+1+0+0+…=七,


如果被问及1000结尾处有多少个0!,答案是‘200+40+8+1=249’

腿是一种承重和运动的解剖结构,通常呈柱状-你的维基百科链接谢谢。固定的腿是一种承重和运动的解剖结构,通常呈柱状-你的维基百科链接谢谢。固定的我的链接好像被截断了。