【发布时间】:2017-12-03 11:28:52
【问题描述】:
给定一个正数 n > 1,求 n 的素因子分解。结果将是一个格式如下的字符串:
"(p1**n1)(p2**n2)...(pk**nk)"
p(i) 以递增的顺序排列,如果 n(i) 为 1,则 n(i) 为空。
示例:n = 86240 应返回 "(2**5)(5)(7**2)(11)"
这是我的代码,但我对 n>250000 的时间有问题
def primeFactors(n):
a=""
i=2
while i<=n:
#part of identifying if number i is prime
w1=5
w2=2
gg=0
while w1*w1<=i:
if i%w1==0:
gg=1
break
w1+=w2
w2=6-w2
#checking if previous loop has been broken
if gg:
i+=1
continue
#countig how many thimes we can divide n on i
c=0
for j in range(1,n):
if n%i!=0: break
c+=1
n=n//i
#if we can divide n on i only once
if c==1:
a+="("+str(i)+")"
elif c>1:
a+="("+str(i)+"**"+str(c)+")"
i+=1
return a
有没有办法解决这个问题?
【问题讨论】:
-
能否请您修复代码中条件子句和循环的缩进?目前我们很难猜测每个子句应该在哪里结束......
-
你遇到了什么问题?
-
时间问题
-
你必须更加明确。你的意思是太长了?多长时间?
-
检查 i 的素数可能是浪费时间。只需首先检查 2 或 3 是否为因数,然后尝试 i = 5、7、11、13、17、19... 之后,在 1 和 -1 mod 6 之间交替。保证成功的
i值成为素数(练习留给读者)。最大的改进可能来自将测试while i<=n替换为while i<=n**0.5。
标签: python python-3.x primes