25.01 Делители числа
Ошибка.
Попробуйте повторить позже
Среди целых чисел, принадлежащих числовому отрезку [173225; 217437], найдите числа, которые представляют собой произведение двух различных простых делителей, заканчивающихся на одну и ту же цифру. Запишите в ответе количество таких чисел и минимальное из них без разделителей.
def simple(x):# Функция,которая проверяет является число простым или нет return x > 1 and all(x % y for y in range(2,int(x**0.5)+1)) def divs(x):# Функция,которая возвращает делители определённого числа d = set() for i in range(2,int(x**0.5)+1): if x % i == 0: d |= {i,x//i} return sorted(d) ans = [] for x in range(173225,217438): d = [i for i in divs(x) if simple(i)] #В списке d будут храниться делители числа x,которые при этом являются простыми числами if len(d) == 2 and (d[0] % 10 == d[1] % 10) and d[0]*d[1] == x: ans += [x] print(len(ans),min(ans))
Ошибка.
Попробуйте повторить позже
Рассматривается множество целых чисел, принадлежащих числовому промежутку
которые делятся на
но не делятся на
и
.
Найдите количество таких чисел и среднее арифметическое минимального и максимальное из этих
чисел
В ответ запишите два этих целых числа: сначала количество, затем среденее арифметическое, если
среднее арифметическое — не целое число, то результат округлите в меньшую сторону.
Для выполнения этого задания можно написать программу или воспользоваться редактором
электронных таблиц.
maxim = 0 minim = 10000000 count = 0 for i in range(1072, 8794): if i % 101 == 0 and i % 11 != 0: if i % 13 != 0 and i % 17 != 0: count += 1 maxim = max(maxim, i) minim = min(minim, i) print(count, int((maxim + minim) / 2))
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [1111; 555555], числа, имеющие четное количество делителей.
Программа должна вывести количество таких чисел.
counter = 0
for i in range(1, int(n ** 0.5) + 1):
if n % i == 0:
counter += 1
if i != n // i:
counter += 1
return counter
a = 1111 # Задаем границы цикла
b = 555555
ans = 0 # Будущий ответ
for i in range(a, b + 1):
if count_divs(i) % 2 == 0:
ans += 1
print(ans)
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [12345; 54321], числа, имеющие ровно 2 натуральных делителя. Программа должна вывести количество таких чисел.
def is_prime(n): # функция на проверку того, что число - простое for j in range(2, int(n ** 0.5) + 1): if n % j == 0: return False return True # Два натуральных делителя есть только у простых чисел. ans = 0 # Будущий ответ for i in range(12345,54322): if is_prime(i): ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [1000; 123456789], числа, имеющие ровно 7 нечетных делителей. Программа должна вывести количество таких чисел.
По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители.
То есть некоторое натуральное число можно разложить в следующий вид:
Здесь – некоторое простое число, а
– натуральный показатель степени. В таком случае число
обязательно имеет
делителей (каждое простое число можно брать от 0 до
раз, где
).
В данной задаче необходимо, чтобы у числа было ровно нечётных делителей. Значит число должно содержать в
разложении простые числа, помимо
, чтобы такие делители были.
Пусть число имеет следующий вид (отдельно выпишем простое число в разложении):
Выпишем количество нечётных делителей числа:
Это количество должно быть равно – простому числу, а значит в этом произведении только один множитель,
равный числу
. Значит некоторое
, откуда
. Поэтому число должно иметь следующий
вид:
Здесь показатель степени k может быть любым неотрицательным числом, так как степень числа не влияет на
количество нечётных делителей.
Таким образом, нужно будет перебрать простые числа (кроме
) и показатели
степени числа
так, чтобы
получить все возможные числа вида
из отрезка
.
def simple(x): # функция для проверки, что число - простое for d in range(2,int(x**0.5)+1): if x % d == 0: return False return True count = 0 # cчётчик чисел simple_numbers = [x for x in range(3,int(123456789 ** (1/6))+1) if simple(x)] # список, в котором хранятся простые числа от 3 до корня 6-ой степени правой границы for number in simple_numbers: # проход по простым числам for i in range(20): # проход по различным степеням для двойки if 1000 <= number**6 * 2**i <= 123456789: # проверка по условию count += 1 print(count) # вывод ответа
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [111111; 777777], число, имеющее максимальное количество натуральных делителей. Если таких чисел несколько — найдите максимальное из них. Программа должна вывести это число.
counter = 0
for i in range(1, int(n ** 0.5) + 1):
if n % i == 0:
counter += 1
if i != n // i:
counter += 1
return counter
a = 111111 # Задаю границы цикла
b = 777777
maxim = 0 # Максимальное количество делителей
ans = 0 # Будущий ответ
for i in range(a, b + 1):
if count_divs(i) >= maxim:
maxim = count_divs(i)
ans = i
print(ans)
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [20211209; 20220126], числа, имеющие ровно 3 различных делителя, которые являются квадратами простых чисел. Программа должна вывести количество таких чисел.
div = [] # Массив делителей
for i in range(2,int(n**0.5)+1):
if n % i == 0:
div.append(i)
if i != n//i:
div.append(n//i)
return div
def is_prime(n):
for j in range(2, int(n ** 0.5) + 1):
if n % j == 0:
return False
return True
def is_sqrt_prime(n):
if int(n**0.5)**2 == n and is_prime(int(n**0.5)):
return True
return False
def count_sqrt_divs(n):
counter = 0
for i in divs(n):
if is_sqrt_prime(i):
counter += 1
return counter
a = 20211209 # Задаю границы цикла
b = 20220126
ans = 0 # Будущий ответ
for i in range(a, b + 1):
if count_sqrt_divs(i) == 3:
ans += 1
print(ans)
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку , числа,
имеющие ровно
натуральных делителей. Напишите в ответ все такие числа через пробел в порядке
возрастания.
По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители.
То есть некоторое натуральное число можно разложить в следующий вид:
Здесь – некоторое простое число, а
– натуральный показатель степени. В таком случае число
обязательно имеет
делителей (каждое простое число можно брать от 0 до
раз, где
).
В данной задаче необходимо, чтобы у числа было ровно 11 натуральных делителей.
Тогда произведение всех должно быть равно 11. Так как число 11 – простое, то только 1 множитель должен быть
равен 11. Отсюда некоторое
.
Тогда число имеет вид где
– любое простое число.
Таким образом, нужно будет перебрать простые числа так, чтобы получить все возможные числа вида из отрезка
.
def is_prime(n): # Функция проверки на простое число for i in range(2, int(n ** 0.5) + 1): if n % i == 0: # Если нашли нетривиальный делитель return False # То число не простое, возвращаем False return n > 1 # Если число равно 1, то оно непростое, и будет возвращено False, а иначе True ans = [] # Список чисел для ответа # Нужно перебрать все числа вида x = p**10, где p - простое число # Находим максимально возможное p для отрезка p_max = int(987654321 ** (1 / 10)) # Перебираем простые числа от 2 до максимально возможного for p in range(2, p_max + 1): if is_prime(p): # Если число p - простое # То проверяем, что итоговое число будет принадлежать отрезку if 123456789 <= p ** 10 <= 987654321: ans.append(p ** 10) print(*sorted(ans)) # Выводим ответ в порядке возрастания
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку , числа, у
которых ровно
делителей, сумма цифр которых некратна
. Количество делителей, чья сумма цифр кратна
, может
быть любым. Программа должна вывести количество таких чисел.
По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители.
То есть некоторое натуральное число можно разложить в следующий вид:
Здесь – некоторое простое число, а
– натуральный показатель степени. В таком случае число
обязательно имеет
делителей (каждое простое число можно брать от 0 до
раз, где
).
В данной задаче необходимо, чтобы у числа было ровно 7 делителей, сумма цифр которых некратна 3. Это означает, что сами делители некратны 3, а значит число должно содержать в разложении простые числа, помимо 3.
Пусть число имеет следующий вид (отдельно выпишем простое число 3 в разложении):
Выпишем количество делителей числа, которые некратны 3:
Это количество должно быть равно 7 – простому числу, а значит в этом произведении только 1 множитель, равный числу 7. Поэтому число должно иметь следующий вид:
Здесь показатель степени k может быть любым неотрицательным числом, так как степень числа 3 не влияет на количество делителей, некратных 3.
Таким образом, нужно будет перебрать простые числа p (исключая 3) так, чтобы получить все возможные числа вида
из отрезка
.
import math def is_prime(n): # Функция проверки на простое число for i in range(2, int(n ** 0.5) + 1): if n % i == 0: # Если нашли нетривиальный делитель return False # То число не простое, возвращаем False return n > 1 # Если число равно 1, то оно непростое, и будет возвращено False, а иначе True ans = 0 # Счётчик для ответа # Нужно перебрать все числа вида x = 3**k * p**6, где p - простое число (кроме 3) # Находим максимальное возможное k для отрезка через логарифм по основанию числа 3 k_max = int(math.log(7654321, 3)) # Находим максимально возможное p для отрезка p_max = int(7654321 ** (1 / 6)) # Перебираем простые числа от 2 до максимально возможного for p in range(2, p_max + 1): if p != 3 and is_prime(p): # Если число p - простое и не равно 3 for k in range(k_max + 1): # Перебираем до k_max включительно if 1234567 <= 3 ** k * p ** 6 <= 7654321: # Проверяем, что итоговое число будет принадлежать отрезку ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку , числа, у
которых есть ровно
делителей, которые оканчиваются на
или
. Общее количество делителей числа может быть
любым. Программа должна вывести количество таких чисел.
По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители.
То есть некоторое натуральное число можно разложить в следующий вид:
Здесь – некоторое простое число, а
– натуральный показатель степени. В таком случае число
обязательно имеет
делителей (каждое простое число можно брать от 0 до
раз, где
).
В данной задаче необходимо, чтобы у числа было ровно 5 делителей, которые оканчиваются на 0 или 5. Тогда эти делители должны быть кратны числу 5, а значит в разложении числа должно участвовать простое число 5.
Пусть число имеет следующий вид:
В таком случае количество делителей, кратных 5, будет равно обозначим
произведение всех
за
. Так как количество по условию должно быть равно 5, то либо
и
, либо
и
. Для
аналогично будет только 1 множитель, а значит только 1 простое число в степени с показателем 4. В
общем случае это можно представить, как
где
– любое простое число (в том числе 5, что обобщает эти два
случая).
Таким образом, нужно будет перебрать простые числа так, чтобы получить все возможные числа вида из отрезка
.
def is_prime(n): # Функция проверки, является ли число простым if n == 1: # Единицу нужно проверить отдельно return False # 1 - не простое число, возвращаем False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: # Если нашли нетривиальный делитель return False # То число не простое, возвращаем False return True ans = 0 # Счётчик для ответа # Нужно перебрать все числа вида x = 5 * p**4, где p - простое число l = 12345678 # Левая граница отрезка # Делим на 5, а затем извлекаем корень 4 степени, # чтобы получить первое возможное p l = int((l / 5) ** (1 / 4)) # Аналогично с правой границей отрезка r = 87654321 r = int((r / 5) ** (1 / 4)) # Перебираем числа от l до r включительно for p in range(l, r + 1): if is_prime(p): # Если число p - простое # Проверяем, что итоговое число будет принадлежать отрезку if 12345678 <= 5 * p ** 4 <= 87654321: ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Напишите программу, которая находит минимальное число, имеющее ровно натуральных делителей. В ответе
запишите найденное число.
count = 0
for i in range(1, int(n ** 0.5) + 1):
if n % i == 0:
count += 1
if n // i != i:
count += 1
return count
i = 0
while True:
if count_divs(i) == 256:
print(i)
break
i += 1
Ошибка.
Попробуйте повторить позже
Найдите все натуральные числа, принадлежащие числовому отрезку [335235; 337235] и имеющие ровно 12 нетривиальных делителей.
Для каждого найденного числа запишите эти 12 делителей на экране, отделенные от друг друга ровно одним пробелом. Делители в строке должны следовать в порядке возрастания.
ans = []
for i in range(2, int(x**0.5)+1):
if x % i == 0:
ans += [i]
if x != x // i:
ans += [x // i]
if len(ans) > 12:
return ans
return ans
for i in range(335235, 337235+1):
if len(count_div(i)) == 12:
print(*sorted(count_div(i)))
Ошибка.
Попробуйте повторить позже
Найдите пять последних натуральных чисел, которые имеет ровно 64 делителя на отрезке [1010101; 101010101]. В ответе укажите подходящие числа в порядке возрастания через пробел.
def count_del(x): ans = [1, x] for i in range(2, int(x ** 0.5) + 1): if x % i == 0: ans += [i] if i != x // i: ans += [x // i] if len(ans) > 64: return False return len(ans) == 64 ans = [] for i in range(101010101, 1010100, -1): if count_del(i): ans += [i] if len(ans) == 5: print(*reversed(ans)) break
Ошибка.
Попробуйте повторить позже
Найдите максимальное число, имеющее ровно 128 делителей, которое будет кратно 16 на отрезке [1010101; 101010101]. Напишите в ответ число и через пробел все его нечетные делители также через пробел в порядке возрастания.
ans = [1, x]
for i in range(2, int(x**0.5)+1):
if x % i == 0:
ans += [i]
if i != x // i:
ans += [x//i]
if len(ans) > 128:
return ans
return ans
for i in range(101010101, 1010101-1, -1):
if len(count_del(i)) == 128 and i % 16 == 0:
print(i)
print(*sorted([i for i in count_del(i) if i % 2 != 0]))
break
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку , числа,
имеющие ровно четыре различных натуральных делителя, не считая единицы и самого числа. Программа должна вывести
количество таких чисел.
def count_div(n): k = 0 for i in range(2, int(n ** 0.5) + 1): if n % i == 0: k += 1 if i != n // i: k += 1 return k ans = 0 for i in range(100100, 300100 + 1): if count_div(i) == 4: ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку , числа,
имеющие ровно три различных натуральных делителя, не считая единицы и самого числа. Программа должна вывести
количество таких чисел.
def divs(n): # функция, которая возращает количество делителей числа k = 0 for i in range(1, int(n**0.5) + 1): if n % i == 0: k += 1 if i != n // i: k += 1 if k > 5: # для оптимизации выходим из функции для текущего числа натуральных делителей, включая 1 и само число больше 5 return 0 return k ans = 0 for i in range(100010, 321342): if divs(i) == 5: ans += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку , числа, у
которых есть ровно
делителей, которые оканчиваются на
или
. Общее количество делителей числа может быть
любым. В ответ запишите все найденные числа через пробел в порядке возрастания.
По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители.
То есть некоторое натуральное число можно разложить в следующий вид:
Здесь – некоторое простое число, а
– натуральный показатель степени. В таком случае число
обязательно имеет
делителей (каждое простое число можно брать от 0 до
раз, где
).
В данной задаче необходимо, чтобы у числа было ровно 5 делителей, которые оканчиваются на 0 или 5. Тогда эти делители должны быть кратны числу 5, а значит в разложении числа должно участвовать простое число 5.
Пусть число имеет следующий вид:
В таком случае количество делителей, кратных 5, будет равно обозначим
произведение всех
за
. Так как количество по условию должно быть равно 5, то либо
и
, либо
и
. Для
аналогично будет только 1 множитель, а значит только 1 простое число в степени с показателем 4. В
общем случае это можно представить, как
где
– любое простое число (в том числе 5, что обобщает эти два
случая).
Таким образом, нужно будет перебрать простые числа так, чтобы получить все возможные числа вида из отрезка
.
def is_prime(n): # Функция проверки, является ли число простым if n == 1: # Единицу нужно проверить отдельно return False # 1 - не простое число, возвращаем False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: # Если нашли нетривиальный делитель return False # То число не простое, возвращаем False return True # Нужно перебрать все числа вида x = 5 * p**4, где p - простое число l = 28916485 # Левая граница отрезка # Делим на 5, а затем извлекаем корень 4 степени, # чтобы получить первое возможное p l = int((l / 5) ** (1 / 4)) # Аналогично с правой границей отрезка r = 49716586 r = int((r / 5) ** (1 / 4)) # Перебираем числа от l до r включительно ans = [] # Список чисел для ответа for p in range(l, r + 1): if is_prime(p): # Если число p - простое # Проверяем, что итоговое число будет принадлежать отрезку if 28916485 <= 5 * p ** 4 <= 49716586: ans.append(5 * p ** 4) print(*ans) # Выводим элементы списка через пробел
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [84052; 84130], число, имеющее максимальное количество различных натуральных делителей, если таких чисел несколько — найдите минимальное из них. Выведите на экран через пробел количество делителей такого числа и само число.
Например, в диапазоне [2; 48] максимальное количество различных натуральных делителей имеет число 48, поэтому для этого диапазона вывод на экране должна содержать следующие значения:
10 48 | |
def count_divs(n): # функция для подсчёта количества делителей числа counter = 0 for i in range(1, int(n**0.5)+1): if n % i == 0: counter += 1 if i != n//i: counter += 1 return counter maxim = 0 maxim_counter = 0 # максимальное кол-во делителей определенного числа for i in range(84052, 84130+1): temp = count_divs(i) if temp > maxim_counter: # если кол-во делителей текущего числа больше максимального кол-ва делителей maxim_counter = temp # обновляем максимальное кол-во делителей maxim = i # обновляем число print(maxim_counter, maxim)
Ошибка.
Попробуйте повторить позже
Найдите все натуральные числа, принадлежащие отрезку [101 000 000; 102 000 000], у которых ровно три различных чётных делителя. Общее количество делителей может быть любым. В ответе перечислите найденные числа через пробел в порядке возрастания.
По основной теореме арифметики (ОТА) каждое натуральное число, большее 1, можно разложить на простые множители.
То есть некоторое натуральное число можно разложить в следующий вид:
Здесь – некоторое простое число, а
– натуральный показатель степени. В таком случае число
обязательно имеет
делителей (каждое простое число можно брать от 0 до
раз, где
).
В данной задаче необходимо, чтобы у числа было ровно 3 чётных делителя. Значит в разложении числа должно участвовать простое число 2.
Пусть число имеет следующий вид:
Выпишем количество делителей числа:
Выпишем количество делителей числа, не содержащих степень числа 2, то есть не являющихся чётными:
Из общего количества делителей вычтем количество делителей, не являющихся чётными, и получим количество чётных делителей:
Обозначим произведение всех за
. Так как количество по условию должно быть равно 3, то
. Так как
число 3 – простое, то либо
и
, либо
и
.
В первом случае это число , так как
означает, что других простых чисел в разложении числа
нет.
Во втором случае произведение всех равно 3, а значит только 1 множитель должен быть равен 3. Поэтому число
будет иметь вид
.
В общем случае это можно представить, как где
– любое простое число (включая число 2, что обобщает эти
два случая).
Таким образом, нужно будет перебрать простые числа так, чтобы получить все возможные числа вида из отрезка
.
def is_prime(n): # Функция проверки, является ли число простым if n == 1: # Единицу нужно проверить отдельно return False # 1 - не простое число, возвращаем False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: # Если нашли нетривиальный делитель return False # То число не простое, возвращаем False return True # Нужно перебрать все числа вида x = 2 * p**2, где p - простое число l = 101_000_000 # Левая граница отрезка # Делим на 2, а затем извлекаем корень 2 степени, # чтобы получить первое возможное p l = int((l / 2) ** (1 / 2)) # Аналогично с правой границей отрезка r = 102_000_000 r = int((r / 2) ** (1 / 2)) # Перебираем числа от l до r включительно ans = [] # Список чисел для ответа for p in range(l, r + 1): if is_prime(p): # Если число p - простое # Проверяем, что итоговое число будет принадлежать отрезку if 101_000_000 <= 2 * p ** 2 <= 102_000_000: ans.append(2 * p ** 2) print(*ans) # Выводим элементы списка через пробел
Ошибка.
Попробуйте повторить позже
Напишите программу, которая ищет среди целых чисел, принадлежащих числовому отрезку [287429; 319267], числа, имеющие ровно 3 различных натуральных делителя. Выведите второй делитель для каждого найденного числа в порядке возрастания в одну строку через пробел.
def divs(x): # функция возращающая список делителей определенного числа d = set() for i in range(1, int(x**0.5)+1): if x % i == 0: d.add(i) d.add(x//i) return sorted(d) for x in range(287429, 319267+1): d = divs(x) if len(d) == 3: # если у определенного числа 3 делителя print(d[1]) # вывод второго делителя