2016-10-15 8 views
3
def classify(numb): 
    i=1 
    j=1 
    sum=0 
    for i in range(numb): 
     for j in range(numb): 
      if (i*j==numb): 
       sum=sum+i 
       sum=sum+j 
      if sum>numb: 
       print("The value",numb,"is an abundant number.") 
      elif sum<numb: 
       print("The value",numb,"is a deficient number.") 
      else: 
       print("The value",numb,"is a perfect number.") 
      break 
    return "perfect" 

Код принимает число (numb) и классифицирует его как обильное, неполное или совершенное число. Мой вывод является отвратительным и работает только для определенных чисел. Я предполагаю, что это отступы или перерыв, который я использую неправильно. Помощь будет принята с благодарностью.Python изобилующий, дефицитный или совершенный номер

+1

Пожалуйста, будьте более конкретными в отношении вашей проблемы на самом деле – agg3l

+0

Я понимаю проблему, но не вашу реализацию или откуда она исходит, не могли бы вы немного объяснить свой код? – Simon

+0

i и j являются факторами числа, если i * j == numb. Тогда и только тогда факторы добавляются к сумме. Когда цикл for завершает, он сравнивает сумму с онемением, чтобы определить, является ли онемение обильным, недостаточным или совершенным. https://en.wikipedia.org/wiki/Abundant_number#Related_concepts – dvdktn

ответ

2

Я бы настоятельно рекомендовал u создать одну функцию, которая создает правильный делитель заданного N, и после этого работа будет легкой.

def get_divs(n): 
    return [i for i in range(1, n) if n % i == 0] 


def classify(num): 
    divs_sum = sum(get_divs(num)) 
    if divs_sum > num: 
     print('{} is abundant number'.format(num)) 
    elif divs_sum < num: 
     print('{} is deficient number'.format(num)) 
    elif divs_sum == num: 
     print('{} is perfect number'.format(num)) 
+0

Почему '<2 * num'? Я предполагаю, что это опечатка. – dkasak

+0

Почему бы не '<2 * num'? «В теории чисел недостающее или недостаточное число - это число n, для которого сумма делителей σ (n) <2n [...]» (https://en.wikipedia.org/wiki/Deficient_number) – mxscho

+0

То есть потому что последнее число, добавленное функцией делителя, - это номер, с которого вы начали. Поэтому вы должны, вероятно, относиться к этому в своих других операциях if. Или вы можете удалить плюс 1 в get div. – Simon

0

Где-то вы что-то неправильно истолковываете. Как вы печатаете, какой тип номера, столько раз, сколько значение числа. Возможно, я что-то пропустил, но все равно.

Сумма делителей можно найти наивности путем использования по модулю

def classify1(num): 
    div_sum = sum(x for x in range(1, num) if num % x == 0) 
    kind = "" 
    if div_sum < num: 
     kind = "deficient" 
    elif div_sum > num: 
     kind = "abundant" 
    else: 
     kind = "perfect" 
    print("{} is a {} number".format(num, kind)) 

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

def mark(li: list, x: int): 

    for i in range(2*x, len(li), x): 
     li[i] = False 
    return li 


def sieve(lim: int): 
    li = [True] * lim 
    li[0] = li[1] = 0 
    for x in range(2, int(lim ** 0.5) + 1): 
     if x: 
      li = mark(li, x) 
    return [2]+[x for x in range(3, lim, 2) if li[x]] 


def factor(num): 

    divs = list() 
    for prime in primes: 
     if prime * prime > num: 
      if num > 1: 
       divs += [num] 
      return divs 
     while num % prime == 0: 
      num //= prime 
      divs += [prime] 
    else: 
     return divs 


def divisors_sum(num): 
    """ 
    Function that implements a geometric series to generate the sum of the 
    divisors, but it is not the divisor function since removing original 
    number. 
    """ 
    divs = factor(num) 
    div_sum, s = 1, 0 
    for div in set(divs): 
     s = 0 
     for exponent in range(0, divs.count(div) + 1): 
      s += div ** exponent 
     div_sum *= s 
    else: 
     return div_sum - num 


primes = sieve(limit) 

но .. там не так много объяснить, из-за первый основной фактор числа, а также использовать функцию делителя, чтобы получить надлежащие делители суммы. Вот и все. Однако ускорение происходит довольно быстро. Возможно, это может привести к смерти, но это гораздо более круче и быстрее.

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

  • Нет связанных вопросов^_^