说实话图中的思路我写了半天也不会实现,但是我自己做了一个,思路如下:(以20为例)
1、创建一个函数,寻找给出数字的因数中小于除数的因数。(即为图中的1,2,4)
(因为5,10,20就是1,2,4因式中的另一半因此不计数)
(一个数就是一个因式,但是有的因数是还可以继续分解的(比如2的因式的另一半10),因此下面继续分解)
2、将2对应的10进行再次执行函数,不对后面其他数字执行,因为会重复(可以自己试试,具体原因不知道怎么解释)
3、因此每次都对因数列表中的第二个数执行该函数即可,循环直至因数列表只有1个元素。
4、将每次统计的数量相加即可。
代码:
def factor(x, f_list, count):
x = int(x)
f_list.clear()
for i in range(1, x):
# 从1到x逐一进行判断是否能整除,且除数是否比自身大,都满足就留下来
if x % i == 0 and i <= x / i:
f_list.append(i)
count += 1
# 判断f_list是否只有1个数,如果只有一个数就只能返回列表中的第一个数1
if len(f_list) == 1:
return x / f_list[0], count
else:
return x / f_list[1], count
def main():
# d是进行了几次循环,最后需要减去d,因为从第二次开始,每次分解都会多算一个因数1
# count是函数内计算每个数进行分解时有几个因数,每次清零
# f_list用于存储每次的因数,每次会清零
d, count = 0, 0
f_list = []
x = input('请输入:')
# 执行第一次因数分解
re = factor(x, f_list, count)
# 判断f_list里第二个数是否可继续分解(即列表内数是否只有1)
while factor(re[0], f_list, count)[1] > 1:
# 将上一个f_list中第二个数作为x,执行函数
re = factor(re[0], f_list, re[1])
d += 1
else:
print(re[1] - d)
if __name__ == '__main__':
global c
main()