资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
给定一个正整数n,尝试对其分解质因数
输入格式
仅一行,一个正整数,表示待分解的质因数
输出格式
仅一行,从小到大依次输出其质因数,相邻的数用空格隔开
样例输入
100
样例输出
2 2 5 5
数据规模和约定
n<=2147483647
分析:
这道题是不难的,问题在于怎样避免超时,所以我们应该尽量优化我们的代码
- 如果输入的数已经是质数了,那么可以直接输出,节省运行时间。
- 如果不是质数,那么就从2开始求解质因数;假设这个数能被2整除,那我们应该直接利用循环一直除,直到该数不能被2整除,然后进行下一个数,直到循环结束。例如n=80,首先从2开始判断是否为80的质因数,很明显80能被2整除,那我们就一直除,直到不能被2整除,即80/2=40,40/2=20,20/2=10,10/2=5,此时n=5不能被2整除,而且3和4也不行,直接到5/5=1,此时循环结束。
- 还有一个问题就是除尽某个质因数之后,要判断该数是否为质数,如果该数是质数,那么直接返回该数,这样子可以省下很多时间,避免超时。
- 其次,在判断质数时,分为偶数和奇数,偶数情况下都不是质数,奇数情况下只需要判断到根号n+1的情况即可,并且步长为2,这样也减少了时间上的消耗。
def fun(n):
# 判断质数
if n < 2:
return False
elif n % 2 == 0:
return False
for i in range(3,int(pow(n,0.5))+1,2):
if n % i == 0:
return False
return True
n = int(input())
for i in range(2,n+1):
if n % i == 0:
while n % i == 0:
print(i,end=' ')
n //= i
if fun(n):
print(n,end=' ')
break