Я бы вначале отсортировал массив чисел по возрастанию.
Зачем для каждого элемента массива проверил бы, а нет ли в массиве числа большего чем данное (для этого сортировал массив, чтобы не перебирать каждый раз все элементы массива - это экономит время), которое делиться на данное, и если такое число есть, то текущее выбрасываем, т. к. оно уже входит в состав большего числа.
(Например в приведенном массиве есть число 3 и есть число 300, 3 можно выкинуть, т.к. 300 делится на 3.)
Зачем оставшиеся числа перемножаем (исключая дубли, если они будут).
(это позволит уменьшить количество чисел и тем самым избежать переполнения типа unsigned long на длинных массивах)
Если такой вариант не сработает, а это возможно (например очень длинный массив), то есть вариант посложнее:
Каждый элемент массива представляем как произведение простых чисел
и все уникальные простые числа складываем в словарь, где ключ - это простое число, а значение - это максимальная степень в которой данное простое число входит в элементы исходного массива.
Например: есть число 100500 = 2*2*3*5*5*5*67, тогда словарь будет такой
{2: 2, 3: 1, 5: 3, 67:1}
После перебора всех элементов исходного массива будем иметь словарь простых чисел и их максимальных степеней.
Для получения результата берем и перемножаем все ключи словаря возведенные в степень значения соответствующего из ключей, это даст наименьшее число, которое делиться на все элементы исходного массива.