Форум » Обработка целых чисел » Тема 25, задача 2866 (генератор) » Ответить

Тема 25, задача 2866 (генератор)

ganilova: # (Д.Ф. Муфаззалов) Собственными делители числа – это все его положительные делители, отличные от самого́ числа. Число называется полусовершенным, если сумма всех или некоторых его собственных делителей совпадает с самим этим числом. Определите количество полусовершенных чисел в диапазоне [2; 2000]. Ответ получается 491, вместо 494. Что я делаю не так? [pre2] k = 0 for x in range(2, 2001): #составим список всех делителей числа не равных самому числу d = [1] i = 2 while i * i < x: if x % i == 0: d.append(i) d.append(x // i) i += 1 if i * i == x: d.append(i) #отсортируем список делителей в порядке убывания d = sorted(d)[::-1] p = x for i in range(len(d)): if p - d[ i] >= 0: p -= d[ i] if p == 0: k += 1 break print(k) [/pre2]

Ответов - 1

Поляков: Это задача 25-83 из основного сборника. Вот решение, которое лежит на сайте:[pre2] start, end = 2, 2000 def allDivs( x ): divs = [1, x] d = 2 while d*d <= x: if x % d == 0: divs.append( d ) if x // d > d: divs.append( x//d ) d += 1 return sorted(divs) def collect( divs, left ): if left == 0: return True if left < 0: return False if not divs: return False return collect( divs[1:], left-divs[0] ) or collect( divs[1:], left ) count = 0 sel = [] for x in range( start, end+1 ): divs = allDivs(x)[:-1] if sum(divs) >= x: if collect( divs, x ): count += 1 sel.append( x ) print(count)[/pre2]



полная версия страницы