因式分解【难度:2级】:
答案1:
class PrimeFactorizer:
def __init__(self
, num
):
self
.factor
= {}
for i
in xrange(2, num
+ 1):
if (num
< i
):
break
while(num
% i
== 0):
num
/= i
self
.factor
[i
] = self
.factor
.get
(i
, 0) + 1
答案2:
from collections
import Counter
class PrimeFactorizer(int):
@
property
def factor(self
):
step
= lambda x
: 1 + x
*4 - (x
//2)*2
maxq
= int(self
** .5)
d
= 1
q
= self
% 2 == 0 and 2 or 3
while q
<= maxq
and self
% q
!= 0:
q
= step
(d
)
d
+= 1
res
= Counter
()
if q
<= maxq
:
res
+= PrimeFactorizer
(self
//q
).factor
res
+= PrimeFactorizer
(q
).factor
else: res
= Counter
([self
])
return res
答案3:
class PrimeFactorizer:
def __init__(self
, number
):
self
.num
= number
self
.factor
= {}
d
= 2
while self
.num
> 1:
while self
.num
% d
== 0:
self
.num
/= d
self
.factor
.setdefault
(d
, 0)
self
.factor
[d
] += 1
d
+= 1
if d
*d
> self
.num
:
if self
.num
> 1:
self
.factor
.setdefault
(self
.num
, 0)
self
.factor
[self
.num
] += 1
break
答案4:
from collections
import defaultdict
class PrimeFactorizer:
def __init__(self
, number
):
self
.factor
= defaultdict
(int)
init_num
= number
i
= 2
while number
> 1 and i
<= init_num
:
if number
% i
== 0:
self
.factor
[i
] += 1
number
/= i
else:
i
+=1
答案5:
class PrimeFactorizer:
def __init__(self
, n
):
self
.factor
= {}
i
= 2
while i
<= n
:
while n
%i
== 0:
occ
= 0
if i
in self
.factor
:
occ
= self
.factor
[i
]
self
.factor
[i
] = occ
+1
n
/= i
i
+=1
答案6:
class PrimeFactorizer:
def __init__(self
, number
):
self
.factor
= {}
self
.number
= abs(number
)
self
.prime_factors
()
pass
def prime_factors(self
):
i
,x
= 0,2
while self
.number
>= x
:
if self
.number
% x
: x
+= 1
else:
self
.number
= self
.number
// x
;
self
.factor
[x
] = self
.factor
[x
] + 1 if x
in self
.factor
else 1
pass
答案7:
from collections
import Counter
def factor(n
):
f
= Counter
()
i
= 2
while n
% i
== 0:
f
[i
] += 1
n
//= i
i
= 3
while i
*i
<= n
:
while n
% i
== 0:
f
[i
] += 1
n
//= i
i
+= 2
if n
> 1:
f
[n
] = 1
return f
class PrimeFactorizer:
def __init__(self
, n
):
self
.factor
= factor
(n
)
答案8:
import itertools
class PrimeFactorizer:
def __init__(self
, num
):
print(num
)
self
.number
= num
self
.factor
= self
.toDict
(self
.findFactors
(num
))
def isPrime(self
, num
):
for i
in itertools
.chain
(range(2,2),range(3,num
-1,2)):
if num
%i
== 0:
return False
return True
def findFactors(self
, num
):
for i
in range(2,num
+1):
if i
== num
:
return [i
]
elif num
% i
== 0 and self
.isPrime
(i
):
return self
.findFactors
(int(num
/i
)) + [i
]
def toDict(self
, arr
):
ans
= {}
for item
in list(set(arr
)):
ans
[item
] = arr
.count
(item
)
return ans
答案9:
from collections
import Counter
from math
import floor
, sqrt
class PrimeFactorizer:
def __init__(self
, n
):
self
.n
= n
@
property
def factor(self
):
return Counter
(PrimeFactorizer
._get_factors_
(self
.n
))
@
classmethod
def _get_factors_(cls
, n
):
def __get_factor__(n
):
for i
in xrange(2, 1 + int(floor
(sqrt
(n
)))):
if n
% i
== 0:
return i
return n
prime_factors
= []
factor
= __get_factor__
(n
)
if factor
== n
: return [factor
]
factors
= [factor
, n
/ factor
]
while factors
:
factor
= factors
.pop
()
new_factor
= __get_factor__
(factor
)
if new_factor
== factor
: prime_factors
.append
(factor
)
else: factors
.extend
([new_factor
, factor
/ new_factor
])
return prime_factors
答案10:
class PrimeFactorizer:
def __init__(self
, n
):
def ps():
l
= []
i
= 2
while True:
for p
in l
:
if not i
% p
:
break
else:
l
.append
(i
)
yield i
i
+= 1
r
= {}
for p
in ps
():
if n
== 1:
break
while n
>= p
and not n
% p
:
if p
not in r
:
r
[p
] = 0
r
[p
] += 1
n
/= p
self
.factor
= r
景越Python基础训练营QQ群
欢迎各位同学加群讨论,一起学习,共同成长!
转载请注明原文地址: https://mac.8miu.com/read-512703.html