题解 | #质数因子#

质数因子

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了,没必要,前面的质数都已经没了
点赞 回复 分享
发布于 05-12 20:32 重庆
这个是不是找到的是因子而不能保证因子是质数哇
点赞 回复 分享
发布于 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 广东

相关推荐

05-16 09:20
已编辑
中国民航大学 Java
点赞 评论 收藏
分享
04-30 21:35
已编辑
长安大学 C++
晓沐咕咕咕:评论区没被女朋友好好对待过的计小将可真多。觉得可惜可以理解,毕竟一线大厂sp。但是骂楼主糊涂的大可不必,说什么会被社会毒打更是丢人。女朋友体制内生活有保障,读研女朋友还供着,都准备订婚了人家两情相悦,二线本地以后两口子日子美滋滋,哪轮到你一个一线城市房子都买不起的996清高计小将在这说人家傻😅
点赞 评论 收藏
分享
评论
164
15
分享

创作者周榜

更多
牛客网
牛客企业服务