Python while循环未按预期工作
我不知道如何克服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_
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’腿是一种承重和运动的解剖结构,通常呈柱状-你的维基百科链接谢谢。固定的腿是一种承重和运动的解剖结构,通常呈柱状-你的维基百科链接谢谢。固定的我的链接好像被截断了。