如何在 Python 3 中检查给定数字是否为阶乘
How to check if a given number is a factorial or not in Python 3
例如 24 是一个阶乘,因为:
4 * 3 * 2 * 1 = 24
代码应将 24 作为输入,输出(见下文)是否为阶乘。
return "is a factorial."
else:
return "is not a factorial."
print("The number " + str(24) + " " + str(isFactorial(24)))
(未经测试,匆忙写的)
def isfac(n):
i = 2
while n > 1:
n = n / i
i = i + 1
return n == 1
最简单的就是倒过来。生成阶乘,直到找到或找不到为止。这样,您肯定总是比较整数:
def is_factorial(n):
i = f = 1
while f < n:
i += 1
f *= i
return f == n
最简单的方法是准备一个现成的列表,其中包含大量阶乘数字,按这样的数组排序
List: 1, 2, 6, 24, 120, ...
然后搜索此列表以查看您的号码是否有效
我建议使用二进制搜索,因为列表已排序。
List of factorial numbers Link
我建议你2个解决方案:
def check_fact(n):
i = fact = 1
while fact<n:
i += 1
fact *= i
return fact==n
def check_fact_opt(n):
i = 1
while n>1:
if n % i == 0:
n /= i
else:
break
i+=1
return n<=1
两者都解决了相同的结果,都解决了你的问题,但后者的迭代次数要少得多:
N is_fact n_it is_fact_opt n_it_opt
2 | True | 1 | True | 1
6 | True | 2 | True | 2
24 | True | 3 | True | 3
50 | False | 4 | False | 2
100 | False | 4 | False | 2
120 | True | 4 | True | 4
200 | False | 5 | False | 2
500 | False | 5 | False | 2
1000 | False | 6 | False | 2
5040 | True | 6 | True | 6
100000 | False | 8 | False | 2
3628800 | True | 9 | True | 9
3628801 | False | 10 | False | 1
100000000000 | False | 14 | False | 2
例如 24 是一个阶乘,因为:
4 * 3 * 2 * 1 = 24
代码应将 24 作为输入,输出(见下文)是否为阶乘。
return "is a factorial."
else:
return "is not a factorial."
print("The number " + str(24) + " " + str(isFactorial(24)))
(未经测试,匆忙写的)
def isfac(n):
i = 2
while n > 1:
n = n / i
i = i + 1
return n == 1
最简单的就是倒过来。生成阶乘,直到找到或找不到为止。这样,您肯定总是比较整数:
def is_factorial(n):
i = f = 1
while f < n:
i += 1
f *= i
return f == n
最简单的方法是准备一个现成的列表,其中包含大量阶乘数字,按这样的数组排序
List: 1, 2, 6, 24, 120, ...
然后搜索此列表以查看您的号码是否有效 我建议使用二进制搜索,因为列表已排序。
List of factorial numbers Link
我建议你2个解决方案:
def check_fact(n):
i = fact = 1
while fact<n:
i += 1
fact *= i
return fact==n
def check_fact_opt(n):
i = 1
while n>1:
if n % i == 0:
n /= i
else:
break
i+=1
return n<=1
两者都解决了相同的结果,都解决了你的问题,但后者的迭代次数要少得多:
N is_fact n_it is_fact_opt n_it_opt
2 | True | 1 | True | 1
6 | True | 2 | True | 2
24 | True | 3 | True | 3
50 | False | 4 | False | 2
100 | False | 4 | False | 2
120 | True | 4 | True | 4
200 | False | 5 | False | 2
500 | False | 5 | False | 2
1000 | False | 6 | False | 2
5040 | True | 6 | True | 6
100000 | False | 8 | False | 2
3628800 | True | 9 | True | 9
3628801 | False | 10 | False | 1
100000000000 | False | 14 | False | 2