32 lines
1.1 KiB
Python
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"
|