📋 Условие
Задание 25 требует написать программу, которая находит делители числа, удовлетворяющие определённым условиям. Рассматриваем оптимальный алгоритм перебора.
🔍 Подробное решение
Задание 25 требует написать программу, которая находит делители числа, удовлетворяющие определённым условиям.
Типовые задачи 25:
1. Найти количество делителей числа
2. Найти сумму делителей
3. Найти делители, удовлетворяющие условию (чётные, нечётные, простые)
4. Найти число по его свойствам делителей
Шаблонный код:
```python
def divisors(n):
d = []
for i in range(1, int(n0.5) + 1):
if n % i == 0:
d.append(i)
if i != n // i:
d.append(n // i)
return sorted(d)
# Пример: найти количество делителей
def count_divisors(n):
cnt = 0
for i in range(1, int(n0.5) + 1):
if n % i == 0:
cnt += 2 if i != n // i else 1
return cnt
```
Задача на поиск числа по свойствам:
```python
for n in range(1, 100000):
d = divisors(n)
if len(d) == 16:
print(n, d)
```
Задача на сумму делителей:
```python
def sum_divisors(n):
s = 0
for i in range(1, int(n**0.5) + 1):
if n % i == 0:
s += i
if i != n // i:
s += n // i
return s
```
Типовые задачи 25:
1. Найти количество делителей числа
2. Найти сумму делителей
3. Найти делители, удовлетворяющие условию (чётные, нечётные, простые)
4. Найти число по его свойствам делителей
Шаблонный код:
```python
def divisors(n):
d = []
for i in range(1, int(n0.5) + 1):
if n % i == 0:
d.append(i)
if i != n // i:
d.append(n // i)
return sorted(d)
# Пример: найти количество делителей
def count_divisors(n):
cnt = 0
for i in range(1, int(n0.5) + 1):
if n % i == 0:
cnt += 2 if i != n // i else 1
return cnt
```
Задача на поиск числа по свойствам:
```python
for n in range(1, 100000):
d = divisors(n)
if len(d) == 16:
print(n, d)
```
Задача на сумму делителей:
```python
def sum_divisors(n):
s = 0
for i in range(1, int(n**0.5) + 1):
if n % i == 0:
s += i
if i != n // i:
s += n // i
return s
```
📚 Теория
Делители чисел. Проверка на простоту, поиск делителей по маске.
🐍 Шаблон Python
Python
# Простое число
def prost(n):
return n > 1 and all(n%d != 0 for d in range(2, int(n**0.5)+1))
# Все делители
def delit(n):
a = set()
for i in range(1, int(n**0.5)+1):
if n % i == 0:
a.add(i); a.add(n // i)
return a
# Простые делители
def prost_del(n):
a = set()
for i in range(2, int(n**0.5)+1):
if n % i == 0:
if prost(i): a.add(i)
if prost(n//i): a.add(n//i)
return a 🐍 Альтернативный способ
Способ 2
# Маски fnmatch
from fnmatch import *
for i in range(18579, 10**10 + 1, 18579):
if fnmatch(str(i), '54?1?3*7'):
print(i, i // 18579)
# Пример: найти R с макс кол-вом делителей
mx = 0; ans = 0
for R in range(2, 10**6):
d = len(delit(R))
if d >= mx and prost(R + 2):
mx = d; ans = R
print(ans)
# Поиск с условиями на делители
for n in range(2, 10**6):
d = delit(n)
pd = prost_del(n)
if len(pd) == 3 and sum(d) % 2 == 0:
print(n)