2015-05-04 2 views
1

Я написал начинающую программу, которая направлена ​​на поиск и печатать простые множители любого числа:Слабо простые множители

def is_prime(n): 
    if n == 3: 
     return True 
    elif n == 4: 
     return False 
    else: 
     n = int(n**0.5)+1 
     for i in range(2,n): 
      if n % i == 0: 
       return False 
     return True 

def prime_factors(n): 
    for i in range(2,n): 
     if n % i == 0: 
      x = i 
      primes.append(x) 
      y = n/x 
      return y 
      break 


primes = [] 

def main(y): 
    while not is_prime(y): 
     y = prime_factors(y) 
    primes.append(y) 
    print(primes) 

Вот примеры прогонов программы, которые имеют меня путать:

main(625) 

[5, 5, 5, 5] 

... 

main(160) 

[160] 

... 

main(6) 

[6] 

... 

main(1007) 

TypeError: unsupported operand type(s) for ** or pow(): 'NoneType' and 'float' 

Некоторые входы работают, а некоторые нет. Я не могу понять, почему. Я также не могу понять, как исправить эту ошибку. Пожалуйста помоги. Спасибо.

+0

* Ваш код * имеет меня путают. Почему «prime_factors» не проверяет, есть ли каждый фактор 'is_prime'? Почему у вас есть один фиксированный список «простых чисел»? Я не понимаю, почему вы ожидаете, что это будет работать вообще. – jonrsharpe

+1

, но конкретно ... if 'n% i' никогда не равен нулю, тогда он возвращает None, который присваивается y. 'is_prime (None)' пытается получить квадратный корень, но терпит неудачу, потому что 'None ** 0.5 ==?' например 'prime_factors (5)' будет возвращать None –

+1

то, что 'break' делает сразу после' return'? – Joel

ответ

5

Ваш is_prime функция, кажется, неправильно повторно использовать переменную n в этих строках:

n = int(n**0.5)+1 
    for i in range(2,n): 
     if n % i == 0: 

Вы могли бы рассмотреть возможность использования более описательные имена, такие как factor_limit, например.

+1

ummm no it doesnt Я не думаю .... только когда n - Нет –

+1

@JoranBeasley: Я не уверен, что вы пытаетесь мне рассказать. Здесь есть ошибка, даже если 'n' не' None'. –

+0

О, я должен быть слепым ... Я вижу сейчас ... –

0

у вас есть много много проблем, вот некоторые из наиболее заметных из них

1. TypeError: unsupported operand type(s) for ** or pow(): 'NoneType' and 'float'

говорит вам, что питон не знает, как None**0.5

2. как уже упоминалось в другом answer вы проверяете, если квадратный корень из п является divisble на не, если N делится на я

3.

def prime_factors(n): 
    for i in range(2,n): 
     if n % i == 0: 
      x = i 
      primes.append(x) 
      y = n/x 
      return y 
      break #<--- this is totally worthless and does nothing 
    #if you get here you are returning None... which breaks(see #1) 
    return [1] #might fix your problem ... 

есть, вероятно, некоторые другие вопросы, а также

+0

Спасибо. Исправлена ​​проблема «NoneType», удаляя всю идею только проверки до квадратного корня ('n = int (n ** 0.5) + 1'), и теперь это работает, но я все еще мог правильно переопределить это. Кроме того, да, не знал возвратных перерывов, хотя это должен быть здравый смысл. Начальные проблемы. – conjenks

Смежные вопросы