Наименьшее общее кратное (НОК) - Python - PullRequest
0 голосов
/ 18 июня 2020

Это не столько о том, как мне это сделать, сколько о том, что не так с этим методом. Мне удалось решить эту проблему с помощью других методов, но я не знаю, почему я не могу с этим. что мне здесь не хватает?

Пример ввода: 4,6 Ожидаемый результат: 12 Фактический вывод: 4

n1, n2 = map(int, input("n1 and n2: ").split(','))

def lcmCalc (n1,n2):
    i = 2
    lcm = 1
    while (n1 != 1) and (n2 != 1):
        if n1 % i == 0 and n2 % i == 0:
            lcm *= i
            n1 = n1/i
            n2 = n2/i
        elif n1 % i != 0 and n2 % i == 0:
            lcm *= i
            n2 = n2/i
        elif n1 % i == 0 and n2 % i != 0:
            lcm *= i
            n1 = n1/i
        else:
            i += 1
    return lcm

print(lcmCalc(n1,n2))

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Вы были близки. Вот изменения:

def lcmCalc(n1, n2):
    i = 2
    lcm = 1
    while (n1 != 1) and (n2 != 1):
        if n1 % i == 0 and n2 % i == 0:
            lcm *= i
            n1 = n1 // i   # <== use floor division operator
            n2 = n2 // i
        elif n2 % i == 0:  # <== remove unneeded 2nd test
            lcm *= i
            n2 = n2 // i
        elif n1 % i == 0:  # <== remove unneeded 2nd test
            lcm *= i
            n1 = n1 // i
        else:
            i += 1
    return lcm * n1 * n2    # <== need to include residuals

Когда внешний l oop завершается, любой из n1 или n2 может все еще быть выше 1. Этот остаток необходимо включить в результат.

0 голосов
/ 18 июня 2020

У меня возникнет соблазн использовать соотношение:

lcm (a, b) = | ab | / gcd (a, b)

И, конечно же, gcd (a, b) = gcd (b, a% b) & gcd (a, 0) = a

Итак, мой код:

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

def lcm(a,b):
    return int(abs(a*b) / gcd(a,b))

или - если вы не возражаете против небольшой помощи стандартной библиотеки:

 from math import gcd

 def lcm(a,b):
    return int(abs(a*b) / gcd(a,b))
...