Максимальное количество делителей числа в интервале с [ M; N ]

uses crt;
function KolDel(n:longint):integer;//функция для подсчета делителей
var i,k:integer;
begin
k:=1;//пока делитель 1, само число
for i:=1 to round(sqrt(n))do//от 1 до крня из числа(дальше нет смысла проверять)
if n mod i=0 then k:=k+1;//если данное число делится на очередное, прибавляем
KolDel:=k;//присваиваем значение функции
end;
var m,n,i:longint;
    mx:integer;
begin
clrscr;
repeat//вводим интервал с проверкой
writeln('Ведите интервал вычислений n>m');
readln(m,n);
until n>m;
mx:=1;//пока максимальное число делителей=1
for i:=m to n do//идем по интервалу
if KolDel(i)>mx then mx:=KolDel(i);//ищем сколько максимально есть делителей у этих чисел
writeln('Максимальное количество делителе=',mx,' имеют:');
for i:=m to n do//снова идем по интервалу
if KolDel(i)=mx then write(i,' ');//если у числа максимальное число делителей, 
//выводим его на экран
readln
end.


from math import sqrt
x = int(input('M : '))
y = int(input('N : '))
def KolDel(N):
    k = 1
    N = round(sqrt(N))
    for i in N:
    if N % i=0
    k=k+1
    KolDel(N) = k
    return k

Помогите перевести с Паскаля на Питон


Ответы (2 шт):

Автор решения: xmurik
dividers = [] #список для делителей.
for divider in range(M, N):
    if divider % X == 0: #проверяем делимость
        dividers.append(divider) #добавляем делитель

print(len(dividers)) #выводим длину списка

ну а в общем, я не понял, что Вы подразумеваете под 'максимальное количество делителей'. он всегда одинаков в статическом диапазоне для определённого Х.

→ Ссылка
Автор решения: Archery

Для тех, кто не понял задачу, подробнее можно почитать здесь. Так же тут есть формулы для более оптимального поиска кол-ва делителей используя простые числа.

https://zaochnik.com/spravochnik/matematika/delimost/nahozhdenie-vseh-delitelej-chisla/

Ваша функция KolDel работает не верно. Я переписала алгоритм, который работает верно, но он не оптимален. В качестве проверки можно использовать число 60 - имеет 12 делителей.

import math

def countDividers(n):
    if n <= 0: return 0 # условно будем так считать
    if n == 1: return 1

    k = 2 # делителей изначально 2, само число и единица.
    for i in range(2, round(math.sqrt(n)) + 1): 
        if n % i == 0:
            k += 1 if i == n // i else 2 #считаем и делитель и частное, если они не совпадают
    return k

def maxDividersCountAtRange(m , n):
    if m > n : m, n = n, m # меняем местами если m > n, только для учебных програм

    maxDivs = 0 #
    numberWithMaxDivs = [] #список чисел с максимальным числом делителей
    for i in range(m, n): #идем по интервалу
        d = countDividers(i) #записываем результат в переменную для оптимизации
        if d > maxDivs: #ищем максимум
            maxDivs = d
            numberWithMaxDivs = [] #очищаем список при изменении максимума
        if d == maxDivs:
            numberWithMaxDivs.append(i) #добавляем число в список

    return maxDivs, numberWithMaxDivs

print(maxDividersCountAtRange(20,80))

Ввод и красивый вывод можно дописать самостоятельно

Питон знаю мало, так что правки приветствуются

→ Ссылка