Объясните проблему с плавающей точкой в ​​факторизации

Я упускаю здесь техническое слово, но проблема здесь в том, чтобы либо изменить 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 подпроцессы. Хороший пример, как не учитывать.

Другие вопросы по тегам