Вы должны уточнить, что вы подразумеваете под «произведением делителей». Код, размещенный в вопросе, пока не работает ни для какого определения. Это звучит как домашнее задание. Если это так, то, возможно, ваш инструктор ожидал, что вы будете думать за пределами кода, чтобы достичь временных целей.
Если вы имеете в виду произведение уникальных простых делителей, например, 72 дает 2 * 3 = 6, тогда вам нужно иметь список простых чисел. Просто пролистайте список до квадратного корня из числа, умножая имеющиеся простые числа на результат. Их не так много, так что вы можете даже жестко запрограммировать их в своей программе.
Если вы имеете в виду произведение всех делителей, простых или нет, то полезно подумать о том, что такое делители. Вы можете получить серьезное увеличение скорости по сравнению с методом грубой силы, предложенным в других ваших ответах. Я подозреваю, что это то, что задумал ваш инструктор.
Если делители упорядочены в списке, то они встречаются парами, которые умножаются на n - 1 и n, 2 и n / 2 и т. Д. - за исключением случая, когда n - идеальный квадрат, где квадратный корень - это делитель, который не связан ни с одним другим.
Таким образом, результатом будет n в степени, равной половине числа делителей (независимо от того, является ли n квадратом).
Чтобы вычислить это, найдите простую факторизацию, используя ваш список простых чисел. То есть найдите степень 2, которая делит n, затем степень 3 и т. Д. Для этого уберите все 2, затем 3 и т. Д.
Число, из которого вы убираете множители, будет уменьшаться, поэтому вы можете выполнить тест с квадратным корнем для промежуточных чисел меньшего размера, чтобы узнать, нужно ли вам продолжить список простых чисел. Чтобы получить некоторую скорость, протестируйте p * p <= m, а не p <= sqrt (m) </p>
Если у вас есть основная факторизация, легко найти количество делителей. Например, предположим, что факторизация равна 2 ^ i * 3 ^ j * 7 ^ k. Тогда, поскольку каждый делитель использует одни и те же простые множители с показателями, меньшими или равными показателям в n, включая возможность 0, число делителей равно (i + 1) (j + 1) (k + 1).
Например, 72 = 2 ^ 3 * 3 ^ 2, поэтому число делителей равно 4 * 3 = 12, а их произведение равно 72 ^ 6 = 139,314,069,504.
При использовании математики алгоритм может стать намного лучше, чем O (n). Но трудно заранее оценить выигрыш в скорости из-за относительно небольшого размера n на входе.