python-checkio/Blizzard/gcd.py

32 lines
1.1 KiB
Python

def divisorGenerator(n, maximum):
divisors = [1]
for i in range(1, min(n+1, maximum+1)):
if n % i == 0 and i not in divisors:
divisors.append(i)
return divisors
def greatest_common_divisor(*numbers):
divisors = []
numbers = list(numbers)
numbers.sort()
maximum = min(numbers[0], round(numbers[-1:][0] / 2))
number_of_numbers = len(numbers)
for number in numbers:
divisors += divisorGenerator(number, maximum)
divisors.sort()
divisors.reverse()
for divisor in divisors:
if divisors.count(divisor) == number_of_numbers:
return divisor
if __name__ == '__main__':
# These "asserts" using only for self-checking and not necessary for auto-testing
assert greatest_common_divisor(6, 4) == 2, "Simple"
assert greatest_common_divisor(2, 4, 8) == 2, "Three arguments"
assert greatest_common_divisor(2, 3, 5, 7, 11) == 1, "Prime numbers"
assert greatest_common_divisor(3, 9, 3, 9) == 3, "Repeating arguments"
assert greatest_common_divisor(1, 1) == 1, "1"
assert greatest_common_divisor(4294967296, 2) == 2, "Edge2"