Python gcd для списка

Я хочу рассчитать gcd для списка чисел. Но я не знаю, что не так с моим кодом.

A = [12, 24, 27, 30, 36]


def Greatest_Common_Divisor(A):
    for c in A:
        while int(c) > 0:
            if int(c) > 12:
                c = int(c) % 12
            else:
                return 12 % int(c)
    print Greatest_Common_Divisor(A)

person redmouse    schedule 22.03.2015    source источник
comment
Вопросы, требующие помощи в отладке (почему этот код не работает?), должны включать желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для их воспроизведения, в самом вопросе. Вопросы без четкой формулировки проблемы бесполезны для других читателей.   -  person thefourtheye    schedule 22.03.2015
comment
Этот вопрос показывает, что он уже реализован в стандартной библиотеке. Просто используйте from fractions import gcd.   -  person Kyle_S-C    schedule 22.03.2015
comment
Кроме того, как только этот оператор return 12 % int(c) выполняется, функция завершается. Возможно, вы хотели использовать генераторы?   -  person Kyle_S-C    schedule 22.03.2015


Ответы (11)


вот кусок кода, который я использовал:

from fractions import gcd
from functools import reduce
def find_gcd(list):
    x = reduce(gcd, list)
    return x
person Ayoub ABOUNAKIF    schedule 13.06.2018
comment
Я получил предупреждение о том, что Fractions.gcd устарел. Теперь рекомендуется использовать math.gcd. - person kevin_theinfinityfund; 02.03.2020
comment
from math import gcd на питоне 3. - person shahar_m; 07.06.2020

Начиная с Python 3.9, Python получил встроенную поддержку вычисления gcd по списку чисел.

import math
A = [12, 24, 27, 30, 36]
print(math.gcd(*A))

Выход:

3
person bigbounty    schedule 05.08.2020

def gcd (a,b):
    if (b == 0):
        return a
    else:
         return gcd (b, a % b)
A = [12, 24, 27, 30, 36]
res = A[0]
for c in A[1::]:
    res = gcd(res , c)
print res

ссылка на ideone

person Pankaj Kumar    schedule 24.07.2015

Мне непонятно, почему вы используете 12 в своей функции? Вы хотите протестировать свой алгоритм конкретно с 12?

Существует встроенная функция, которая обеспечивает хорошее решение (fraction.gcd()), как указано в этом ответе

Если вы хотите разработать свой собственный подход, вы можете сделать это следующим образом: отсортировать список и получить минимальный номер списка (назовем его min). Цикл от 2 до min, вы можете получить большой общий делитель вашего списка.

person edwardramsey    schedule 22.03.2015

Я использовал этот фрагмент кода:

def gcd(my_list):
    result = my_list[0]
    for x in my_list[1:]:
        if result < x:
            temp = result
            result = x
            x = temp
        while x != 0:
            temp = x
            x = result % x
            result = temp
    return result 
person kourosh    schedule 03.02.2019

Если вы хотите использовать существующий метод, попробуйте `np.gcd.reduce':

import numpy as np

A = [12, 24, 27, 30, 36]

print(np.gcd.reduce(A))

который возвращает 3

person uhoh    schedule 23.04.2020
comment
Его предоставление WA в списке len › 100000 - person DikShU; 06.07.2021
comment
@ДикШУ Расскажите нам больше! Это работает для меня с длиной 1 000 000 np.gcd.reduce((6060842*np.random.rint(1, 10000000, 1000000)).tolist()) возвращает 6060842 с использованием numpy 1.19.2 Что именно представляет собой тест, для которого он не работает для вас? Какую версию numpy вы используете? Какие другие методы gcd проходят ваш тест, если это не удается? - person uhoh; 06.07.2021
comment
Я использую это на Codechef (сайт CP в Индии), где он проходит тестовые случаи, когда длина составляет ‹ 1000, но далее в исходных ограничениях он дает WA. - person DikShU; 07.07.2021
comment
@DikShU Понятно, WA = неправильный ответ. Я зашел на сайт и попытался запустить его i.stack.imgur.com/5iHu7.png и я не смог импортировать numpy i.stack.imgur.com/Mi4fu.png так что я даже не смог проверить это там. Я не уверен, как Python работает на сайте, но этот метод подходит для локального запуска на компьютере. Я точно не знаю, почему вы получаете WA, но, похоже, это связано с Codechef, а не с сообщением Python. Кстати, в моем оригинале опечатка, это np.random.randint, а не ...rint. - person uhoh; 07.07.2021
comment
для запуска python в коде запуска Codechef под попыткой и исключением и спасибо за помощь ... это может быть какая-то другая причина для WA. Далее вопрос здесь ---codechef.com/JULY21C/problems/MINNOTES - person DikShU; 07.07.2021

import functools as f
A = [12, 24, 27, 30, 36]
g = lambda a,b:a if b==0 else g(b,a%b)   #Gcd for two numbers
print(f.reduce(lambda x,y:g(x,y),A))     #Calling gcd function throughout the list.

«Лямбда» — это анонимная функция, в которой «g» при каждом вызове назначается НОД из двух чисел.

«Уменьшить» — это функция в модуле «functools», которая используется для выполнения определенной функции для всех элементов в списке. Здесь reduce() вычисляет НОД полного списка A, вычисляя НОД первых двух элементов, затем НОД третьего элемента с ранее вычисленным НОД первых двух элементов и так далее.

Надеюсь, это развеет ваши сомнения.

person kateshdrops    schedule 18.10.2018
comment
Из обзора: не могли бы вы добавить больше объяснений, почему это решает проблему? - person toti08; 18.10.2018
comment
Эй, да, я добавил больше объяснений того, как это решает проблему. - person kateshdrops; 18.10.2018

return выходит из функции. Внутри цикла for это обычно не предназначено.

person Daniel    schedule 22.03.2015

Как я вижу, ваш код просто зациклится. Поскольку вы вызываете метод Greatest_Common_Divisor рекурсивно, но без базового случая. Выровняйте print Greatest_Common_Divisor(A) и "def" в одном столбце, и эта проблема будет решена. Но все же то, что ваш код делает для каждого числа ai, он берет остаток от ai % 12, а затем просто печатает 12 % (ai % 12), и нет никакой связи между ним и GreatCommonDivisor. Вот простой код для gcd(a,b), который вы можете использовать для всего массива:

def gcd (a,b):
    if (b == 0):
        return a
    else:
         return gcd (b, a % b)
person Mamuka    schedule 22.03.2015

from functools import reduce
def gcd(a,b):
    if a==0:
        return b 
    else:
        return gcd(b%a,a)
A = [12, 24, 27, 30, 36]
gcdp = reduce(lambda x,y:gcd(x,y),A)
print(gcdp)

Я думаю, что это развеет ваши сомнения.

person Anonymous    schedule 07.05.2018

gcd списка, введенного пользователем, который может использоваться для любого количества входных значений.

 n = int(input('enter no of numbers: '))
a = list(map(int,input('enter numbers to find gcd: ').strip().split()))[:n]

def gcd(num1,num2):
    x = 1
    while x:
        if max(num1,num2) % min(num1,num2) == 0:
            return min(num1,num2)
            x = 0
        else :
            r = max(num1,num2)%min(num1,num2)
            return gcd(max(num1,num2),r)

while True:
        a[0] = gcd(a[0],a[1])
        a.pop(1)
        if len(set(a))>2:
            a.pop(2)
        if len(set(a)) == 1:
            break
a = set(a)
print(a)
person vamshi madineni    schedule 24.07.2019