题解 | #质数因子#

质数因子

http://www.nowcoder.com/practice/196534628ca6490ebce2e336b47b3607

大多数同学只关注到了一开始的时候使用平方根降低复杂度,然而忽略了后续进一步的优化,假如测试用例加上2的1000次方会如何?
使用while循环会比使用for循环时间复杂度要低,for循环的条件在循环中是不可变化的,而while循环每一次都可以重新调整条件缩小范围(如果条件有变化),从而这个时间复杂度差不多是12logn\frac{ 1 }{ 2 }\log{n},而高赞题解所使用的for循环时间复杂度是n\sqrt{ n }
本地测试中,测试数字为2的60次方时,while循环用时0秒,高赞for循环用时107.0277秒。狗头保命

import math
num = int(input())
s = ''
prime = 2
while prime < math.sqrt(num)+1:
    if num%prime != 0:
        prime += 1
    else:
        num = num //prime
        s += str(prime)+' '
        prime = 2
if num>=2:
    s += str(num)+' '
print(s)
全部评论
题目说数据的范围在1到2x10的9次方+14,应该不存在2的1000次方。你说的确实是可以优化的地方,在数据范围非常大的情况下,使用while循环的确能够降低时间复杂度
1 回复 分享
发布于 2022-05-09 18:00
我有个疑问,就是我照着你的方法试了下我自己的,但是因为while语句中的num发生了变化,导致while判断除了问题,所以我又给num在开始赋值给了另一个变量来判定,想问下你的会出现这个问题吗
1 回复 分享
发布于 2022-05-08 10:39
while循环很赞 有个小小疑问else里的prime = 2是否可以不要呢。。如果第一轮循环被除数num无法被2整除,那么其实它以后也不会了,是不是不用再每轮将prime初始化为2了呢
3 回复 分享
发布于 2022-05-26 18:31
少了输入为1的情况
2 回复 分享
发布于 2022-08-24 15:57 陕西
如果这个数的因子都是大质数,比如59,那59的1000次方用这个方法需要每次都进行因子的判断递增,for循环只用一次,之后判断整除就行。只能说while的优势是在小的质数因子上。
1 回复 分享
发布于 2024-06-11 18:21 江苏
思路是不错,但对比有点夸张了。你是从2开始考虑往上加的,又用了因数全是2的大数,所以省时间了。实际使用起来优势应该不会这样夸张
1 回复 分享
发布于 2022-10-28 08:56 上海
后面不需要再令prime=2了,没必要,前面的质数都已经没了
点赞 回复 分享
发布于 2025-05-12 20:32 重庆
这个是不是找到的是因子而不能保证因子是质数哇
点赞 回复 分享
发布于 2025-01-18 21:52 陕西
很巧妙,用while不断迭代,我改进了一下,因子每一次都除尽,然后自增继续迭代,应该是更优解 x = int(input()) i = 2 while i < int(math.sqrt(x))+1: while x%i==0: print(i,end = ' ') x = x/i i += 1 if not x ==1: print(int(x))
点赞 回复 分享
发布于 2024-04-29 12:22 上海
if num>=2:这句可以不要
点赞 回复 分享
发布于 2023-09-08 11:41 广东

相关推荐

找工作勤劳小蜜蜂:自我描述部分太差,完全看不出想从事什么行业什么岗位,也看不出想在哪个地区发展,这样 会让HR很犹豫,从而把你简历否决掉。现在企业都很注重员工稳定性和专注性,特别对于热爱本行业的员工。 你实习的工作又太传统的it开发(老旧),这部分公司已经趋于被淘汰,新兴的互联网服务业,比如物流,电商,新传媒,游戏开发和传统的It开发有天然区别。不是说传统It开发不行,而是就业岗位太少,基本趋于饱和,很多老骨头还能坚持,不需要新血液。 工作区域(比如长三角,珠三角,成渝)等也是HR考虑的因素之一,也是要你有个坚定的决心。否则去几天,人跑了,HR会被用人单位骂死。
点赞 评论 收藏
分享
评论
171
16
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务