描述
功能: 输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180
的质因子为2 2 3 3 5
)
数据范围: 1 ≤ n ≤ 2 × 1 0 9 + 14 1 \le n \le 2 \times 10^{9} + 14 1≤n≤2×109+14
输入描述:
输入一个整数
输出描述:
按照从小到大的顺序输出它的所有质数的因子,以空格隔开。
示例1
输入:
180
输出:
2 2 3 3 5
解题思路: 我们从因数2
开始循环,直到大小等于输入数据结束,判断输入数据可以被什么数字整除,然后将因子变为字符类型存放于列表中,然后进行循环,直到输入数据为1
时找到所有因子结束。用列表保存是因为我们看到输出结果中间使用空格连接,列表字符数据可以使用join()
方法进行字符串拼接。
方法一:
num = int(input())
factor_list = []
while num != 1:
for i in range(2, int(num + 1)):
if num % i == 0:
factor_list.append(str(i))
num /= i
break
print(" ".join(factor_list))
但是不难发现,将整型因子全部转换为字符类型并用列表保存最后再进行拼接,依然会耗费不少电脑资源,因此考虑使用格式化输出来解决这一问题。
方法二:
num = int(input())
while num != 1:
for i in range(2, int(num + 1)):
if num % i == 0:
num /= i
print(i, end=" ")
break
虽然方法得到了优化,但是我们不难发现,每次进行for
循环时,我们都需要进行一次break
,然后重新从2
开始进行for
循环,并且外层嵌套了一个while
循环体。考虑调整结构,一次性找出相等的所有因子,比如180
的因子有2 2 3 3 5
。
方法三:
num = int(input())
for i in range(2, int(num + 1)):
while num % i == 0:
num /= i
print(i, end=" ")
这次我们将while
循环放在for
的内部,一次遍历找出所有相同for
循环内的因子,提高效率。
大功告成了吗?并不,实际中将上述我们优化了数次的代码写入牛客网,会在最后一组测试数据中提示超时。可以自行尝试当输入数据为2000000014
时,程序加载速度会非常慢。因此我们需要进一步继续优化。在数学上,寻找质因子可以只循环到sqrt(num) + 1
时候截止。因此我们调整for
循环中的代码。
方法四:
import math
num = int(input())
lst = []
for i in range(2, int(math.sqrt(num) + 1)):
while num % i == 0:
lst.append(i)
num = int(num / i)
for i in lst:
print(i, end=" ")
if num > 2:
print(num)
方法五:
import math
num = int(input())
for i in range(2, int(math.sqrt(num) + 1)):
while num % i == 0:
num /= i
print(i, end=" ")
if num > 2:
print(int(num))
注意: 牛客网中是可以导入math
包的。
上述方法其实也可以不用导入math
包,可以使用num ** 0.5
或者pow(num, 0.5)
进行替换。另外需要注意,当最终得到的num
不为1
时,此时的num
本身便为一个质因数,因此我们需要单独进行输出操作。
码字不易,如果大家觉得有用,请高抬贵手给一个赞让我上推荐让更多的人看到吧~