2016-12-13 2 views
0

Я пытаюсь найти большой общий делитель, используя функцию и решая ее итеративно. Хотя по какой-то причине я не уверен, почему я не получаю правильный результат.Поиск Величайшего общего делителя через итерационное решение (python 3)

Наибольший общий делитель между 30 & 15 должен быть 15, однако мой вывод всегда дает мне неправильный номер. У меня сильное чувство, что мое утверждение «если» сильно неверно. Пожалуйста помоги!

def square(a,b): 
    ''' 
    x: int or float. 
    ''' 
    c = a + b 

    while c > 0: 
     c -= 1 
     if a % c == 0 and b % c == 0: 
      return c 
     else: 
      return 1 

obj = square(30,15) 
print (obj) 
+2

Переместить ваш 'else' наружу время цикла – inspectorG4dget

+0

функция квадрата ничего – Manny102030

+1

Почему это называется * квадрат * не вернуть? – user2357112

ответ

2

Вы должны возвращать значение, только если вы закончили переборе все номера и не нашел ни один из них делитель для обоих чисел:

def square(a, b): 
    c = a + b 

    while c > 0: 
     if a % c == 0 and b % c == 0: 
      return c 
     c -= 1 
    return 1 

Однако последний return будет ненужной в данном случае, как c будет идти от a + b до 1 и mod 1 всегда будет иметь общий делитель, поэтому цикл всегда будет заканчиваться 1, для наихудшего случая.

Кроме того, число больше a и b может не общий делитель из них. (x mod y for y > x yields x) и gcd это официальное название для выполнения этой задачи, так что я бы с

def gcd(a, b): 
    for c in range(min(a, b), 0, -1): 
     if a % c == b % c == 0: 
      return c 

для итерационного решения.

0

Возможно, вам будет интересно узнать, что существует общее рекурсивное решение проблемы GCD на основе the Euclidian algorighm.

def gcd(a, b): 
    if b == 0: 
     return a 
    else: 
     return gcd(b, a % b) 

print(gcd(30, 15)) 
# 15 
+0

OP заявила, что хочет ** итеративный ** способ решения. – Uriel

+0

и btw, 'def euclid (m, n): return euclid (n, m% n), если n else m' должно быть достаточным. – Uriel

+1

@Uriel В вашем ответе четко объясняется, как исправить его итерационное решение. Я думал, что ему может быть интересно узнать об алгоритме Евклида в качестве альтернативы. –

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