import sys
# 修改递归上限,防止达到最大递归深度
sys.setrecursionlimit(1000000000)

def get_z(x):
    if x > 1:   # 递归结束条件:如果被除数为1,则结束递归
        i = 2
        while x % i != 0:    # 整除判断条件:如果成功整除,跳出循环
            i += 1  # 如果不能被整除,则除数+1
            if i > x ** 0.5 + 1:
                i = x
        x = x // i
        print(i, end = ' ')
        get_z(x)

x = int(input())
if x >= 1 and x <= (2 * 10 ** 9 + 14):  # 根据题目要求判断数值是否符合数据范围要求
    get_z(x)
else:
    pass

本题的精髓在于对被除数开方,以达到减少程序运行时间的目的

开方节约时间的原因,可以按如下理解:

设,未知数为x,其平方根值为a,质数因子全为正整数。则

对于一个整数x来说,他的质数因子会被它的平方根值a分成大于a和小于a两个部分,且为一一对应关系,即如果在小于a的部分存在一个质数因子的话,那么在大于a的部分一定存在对应的另一个因子

如果在range(2, int(a)+1)中不存在合适的质数因子时,则说明在小于a的部分存在的x的质数因子只能是1,进而可以推出在大于a的部分,x的质数因子就是它自身。

所以,当i大于int(a)+1时,x的质数因子只能是其自身。

不过,我只是想练习一下递归罢了……

【目的】

递归练习

递归的两个特点:① 调用自身;② 有结束条件。