Объясните проблему с плавающей точкой в факторизации
Я упускаю здесь техническое слово, но проблема здесь в том, чтобы либо изменить int на float, либо float на int.
def factorize(n):
def isPrime(n):
return not [x for x in range(2,int(math.sqrt(n)))
if n%x == 0]
primes = []
candidates = range(2,n+1)
candidate = 2
while not primes and candidate in candidates:
if n%candidate == 0 and isPrime(candidate):
# WHY ERROR?
#I have tried here to add float(), int() but cannot understand why it returns err
primes = primes + [float(candidate)] + float(factorize(n/candidate))
candidate += 1
return primes
Ошибка - попытался исправить это с помощью таких функций, как int()
а также float()
но все же сохранятся
TypeError: 'float' object cannot be interpreted as an integer
3 ответа
Это выражение является вашей непосредственной проблемой:
float(factorize(n/candidate))
factorize
возвращает список, но float
его аргумент должен быть строкой или числом.
(В вашем коде много, много других проблем, но, возможно, вам лучше открыть их для себя...)
Обратите внимание, что вы возвращаете list
и в строке:
primes = primes + [float(candidate)] + float(factorize(n/candidate))
Но float
работает с числами или строками, а не списком.
Правильное решение будет:
primes = primes + [float(candidate)] + [float(x) for x in factorize(n/candidate)]
# Converting every element to a float
Не могу понять, что имел в виду Гарет many, many other problems
проблема в санации!
def factorize(n):
# now I won`t get floats
n=int(n)
def isPrime(n):
return not [x for x in range(2,int(math.sqrt(n)))
if n%x == 0]
primes = []
candidates = range(2,n+1)
candidate = 2
while not primes and candidate in candidates:
if n%candidate == 0 and isPrime(candidate):
primes = primes + [candidate] + factorize(n/candidate)
candidate += 1
return primes
clearString = sys.argv[1]
obfuscated = 34532.334
factorized = factorize(obfuscated)
print("#OUTPUT "+factorized)
#OUTPUT [2, 2, 89, 97]
Лучше, но вы можете сделать это проще или меньше строк?
def factorize(n):
""" returns factors to n """
while(1):
if n == 1:
break
c = 2
while n % c != 0:
c +=1
yield c
n /= c
print([x for x in factorize(10003)])
Сравнение времени
$ time python3.1 sieve.py
[100003]
real 0m0.086s
user 0m0.080s
sys 0m0.008s
$ time python3.1 bad.py
^CTraceback (most recent call last):
File "obfuscate128.py", line 25, in <module>
print(factorize(1000003))
File "obfuscate128.py", line 19, in factorize
if n%candidate == 0 and isPrime(candidate):
KeyboardInterrupt
real 8m24.323s
user 8m24.320s
sys 0m0.016s
at least O(n)
Это большое преуменьшение, лол, что я могу найти в Google, давайте рассмотрим плохой результат с большим простым. 10003
по крайней мере, пешки 10002!
подпроцессы, 10003
пешки 10002
потому что каждый сбой, и он не может быть оценен, пока каждый из их подпроцессов не будет оценен, и каждый n
подпроцесс будет иметь n-1
подпроцессы. Хороший пример, как не учитывать.