06---质数因子

描述

功能: 输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5

数据范围: 1 ≤ n ≤ 2 × 1 0 9 + 14 1 \le n \le 2 \times 10^{9} + 14 1n2×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本身便为一个质因数,因此我们需要单独进行输出操作。

码字不易,如果大家觉得有用,请高抬贵手给一个赞让我上推荐让更多的人看到吧~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

勤奋的大熊猫

你的鼓励将是我写作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值