📅  最后修改于: 2023-12-03 15:34:29.605000             🧑  作者: Mango
在数学中,如果一个整数能被另一个整数整除,则前者就是后者的因数。在Python中,我们可以使用循环来找到一个数的因数。
暴力枚举即是对于每个可能是因数的数值,我们都测试一通,从而寻找因数。
def find_factors_1(num):
factors = []
for i in range(1, num+1):
if num % i == 0:
factors.append(i)
return factors
这个程序中,我们使用了for循环遍历1到num中的每个整数,并且测试它是否是num的因数。如果是,那么就将它加入到factors列表中。最后,我们返回列表factors。
我们可以发现,上述方法在寻找因数时,进行了许多不必要的运算。比如对于一个合数N,如果它有4个因数,那么它一定可以写成a * b的形式。因为如果它不是这种形式的话,就必定有一个因数小于sqrt(N),一个因数大于sqrt(N),因此最多只有3个因数。
因此,我们只需要枚举从1到sqrt(N)的数,对于每个数,我们只需要判断它是否是N的因数,然后将N/i这个数也加入到结果列表中即可。
import math
def find_factors_2(num):
factors = []
for i in range(1, int(math.sqrt(num))+1):
if num % i == 0:
factors.append(i)
if num // i != i:
factors.append(num // i)
return factors
这个程序中,我们使用了for循环遍历1到sqrt(num)中的每个整数,并且测试它是否是num的因数。如果是,那么就将它加入到factors列表中,并且将num/i这个数也加入到factors列表中。最后,我们返回列表factors。
在上述方法中,我们仍然对某些数进行了不必要的测试。比如,如果num=2,则我们仍然会从1到它进行测试。因此,我们可以将1提前加入到factors列表中,并且从2开始遍历。同时,我们注意到,当num为1时,sqrt(num)的值为0,因此在这种情况下,我们需要特判。
def find_factors_3(num):
if num == 1:
return [1]
factors = [1, num]
for i in range(2, int(math.sqrt(num))+1):
if num % i == 0:
factors.append(i)
if num // i != i:
factors.append(num // i)
return sorted(factors)
这个程序与上述程序类似,但是我们在循环前加入了1,并且特判了当num=1时的情况。最后,我们返回列表factors,并且对它进行了排序。
以上就是在Python中,使用循环找到一个数的因数的三种方法。对于小数据而言,可以采用方法一。对于大数据而言,可以采用方法二或者方法三,从而优化程序的效率。