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的质数因子只能是其自身。
不过,我只是想练习一下递归罢了……
【目的】
递归练习
递归的两个特点:① 调用自身;② 有结束条件。