чуть-чуть короче (нет)
версия 1:
n = int(input())
for i in range(11, n + 1):
print(i, '+' * len(list(filter(lambda x: i % x == 0, range(1, i + 1)))), sep='')
версия 2:
n = int(input())
for i in range(11, n + 1):
print(i, '+' * len(list(filter(lambda x: not(i % x), range(1, i + 1)))), sep='')
версия 3:
Хватит разврата и откопал стюардессу
n = int(input())
print("n".join(map(lambda i: str(f'{i}' + '+' * len(list(filter(lambda x: not(i % x), range(1, i + 1))))), range(11, n + 1))))
версия 4:
print("n".join(map(lambda i: str(f'{i}' + '+' * len(list(filter(lambda x: not(i % x), range(1, i + 1))))), range(11, int(input()) + 1))))
версия 5, окончательная (покороче):
print("n".join(map(lambda i: f'{i}' + '+' * len(list(filter(lambda x: not(i % x), range(1, i + 1)))), range(11, int(input()) + 1))))
Делитель — это число, на которое нацело делится делимое. У делимого может быть один или несколько делителей, найти их все можно с помощью простого алгоритма, который без проблем реализуется на Python 3.
Нахождение делителей числа
С практической точки зрения будет полезно, если программа на Python не только будет находить делители числа, искать их сумму, определять минимальный и максимальный, а также простые делители.
Каждая подзадача так или иначе связана с предыдущей, поэтому код последующей программы — это немного модернизированный код предыдущей. Кроме того, весь функционал при необходимости можно объединить в одной программе.
Алгоритм нахождения очень простой. В цикле перебираются значения от делимого минус единица до двух включительно. Если делимое нацело делится на текущее значение, то оно является делителем.
Пользователь вводит целое число, делителей которого будет искать программа, тогда код выглядит так:
numb = int(input("Введите целое число: ")) print("Результат:", end = " ") for i in range(numb - 1, 1, -1): if (numb % i == 0): print(i, end = " ")
Например, пользователь ввёл число 625. Программа начинает цикл со значения 624, в цикле проверяется, делится ли нацело 625 на 624, затем цикл переходит на следующую итерацию и работает уже с числом 623 и так до двух. Таким образом, вывод программы будет следующим:
Введите целое число: 625 Результат: 125 25 5
Простые делители числа
Простой делитель — это делитель, который делится только на единицу и самого себя. Для нахождения простых делителей с помощью Python нужно немного модернизировать программу, добавив в неё дополнительный цикл for и переменную счётчик.
Программа построена по следующему алгоритму:
- Обнулить счётчик.
- В цикле искать делители.
- Если найден, искать во вложенном цикле его делители. Это для того, чтобы определить: является ли он простым.
- Если найден, увеличить счётчик.
- Если счётчик равен нулю, то число простое и надо вывести значение делителя в консоль.
- Перейти на следующую итерацию внешнего цикла.
Цикл теперь выглядит так:
numb = int(input("Введите целое число: ")) print("Простые:", end = " ") for i in range(numb - 1, 1, -1): is_simple = 0 # Счётчик if (numb % i == 0): for j in range(i - 1, 1, -1): if (i % j == 0): is_simple = is_simple + 1 # Увеличиваем, если находим делитель if (is_simple == 0): # Если делителей не было найдено, выводим print(i, end = " ")
Понятно, что если значение счётчика больше нуля — то число точно не простое. Можно оптимизировать немного код и сразу завершать вложенный цикл после увеличения счётчика. Для этого можно воспользоваться оператором break
в условном операторе, находящемся во вложенном цикле.
Результат работы программы:
Введите целое число: 63 Простые: 7 3
Делители расположены в порядке убывания. И если надо вывести только самый большой простой делитель с помощью Python, то можно после того, как выведется первое число, воспользоваться оператором break
для выхода из цикла.
Сумма делителей
Для того чтобы найти сумму всех делителей числа с помощью Python, достаточно добавить в начальную программу переменную, к которой в цикле будет прибавляться каждый найденный делитель.
Код программы:
numb = int(input("Введите целое число: ")) sum_of_dividers = 0 for i in range(numb - 1, 1, -1): if (numb % i == 0): sum_of_dividers += i print("Сумма:", sum_of_dividers)
Результат выполнения кода:
Введите целое число: 63 Сумма: 40
Количество делителей
Этот вариант программы также лишь незначительно отличается от изначального. Для подсчёта делителей нужно ввести переменную-счётчик, к которой будет прибавляться единица каждый раз, когда условие «numb % i == 0
» будет выполняться.
numb = int(input("Введите целое число: ")) count_of_dividers = 0 for i in range(numb - 1, 1, -1): if (numb % i == 0): count_of_dividers += 1 print("Количество равно:", count_of_dividers)
Результаты выполнения программы:
Введите целое число: 63 Количество равно: 4
Максимальный и минимальный делитель
Для нахождения минимального и максимального делителя в код на Python нужно добавить две переменные: min_divider
и max_divider
. В цикле делитель будет сравниваться со значением этих переменных и, если необходимо, записываться в них.
Код программы:
numb = int(input("Введите целое число: ")) min_divider = numb max_divider = 1 for i in range(numb - 1, 1, -1): if (numb % i == 0): if (min_divider > i): min_divider = i if (max_divider < i): max_divider = i print("Минимальный равен:", min_divider) print("Максимальный равен:", max_divider)
Результат выполнения:
Введите целое число: 63 Минимальный равен: 3 Максимальный равен: 21
Нахождение наименьшего и наибольшего делителя, подсчёт суммы делителей и их количества можно объединить в одну программу на Python. Это не должно вызвать каких-либо проблем или конфликтов, потому что программа работает с 4 независимыми переменными.
We need to find the divisors of the number first, and then sum them. Finding out if a number is a divisor of another number is pretty simple:
if x % y == 0:
is_divisor = True
Modulo — % — returns the remainder of a division. 9 % 2 = 1. 10 % 3 = 1. However, we’ll need to know which numbers to check. We could just loop through every number up to our input:
for i in range(n):
if n % i == 0:
is_divisor = True
…but that’s too much. For example, we know that the highest possible divisor of n that isn’t n itself, is 1/2n if n is even, and lower if it’s not. Instead, let’s focus on getting each pair, and then check if we should continue. We also need to store all of these numbers, so lets create some lists:
lower_divisors = []
upper_divisors = []
We’ll want to know what our current highest lower divisor and lowest highest divisor are, and also know where to start. We can populate the lower divisor list with 1 and the highest with n. We can worry about removing n later.
lower_divisors = [1]
upper_divisors = [n]
continu = True
while continu:
# Let's get the last item in each list
highest_low = lower_divisors[-1]
lowest_high = upper_divisors[-1]
for i in range(highest_low + 1, lowest_high):
if n % i == 0:
lower_divisors.append(i)
upper_divisors.append(n // i)
break
continu = False
# If we've left the loop, we have all of our divisors.
lower_sum = sum(lower_divisors)
higher_sum = sum(upper_divisors) - n #Gotta take it back out!
sm = lower_sum + higher_sum
return sm
That should be a fast way to achieve your goal, without making your computer work harder — but… it’s a lot more steps to write. I wrote it in far more steps to make it clear what I was doing and to be readable, but it could definitely be trimmed up a lot.
Upon running the code, the simple method of looping through each number from 1 to n starts to really add up when n is over 8 digits. 9 digit numbers were taking around 12-16 seconds on my machine. The longer approach above returns 32-digit values for n in under 1/10th of a second.
2 / 2 / 0
Регистрация: 14.11.2019
Сообщений: 75
1
Нахождение количества делителей и их сумму для вводимого числа по формулам
12.10.2020, 12:57. Показов 12464. Ответов 5
Количество всех натуральных делителей натурального числа n обозначается σ0(n). Сумма всех натуральных делителей числа n обозначается σ1(n).
Входные данные
Дано натуральное n≤109.
Выходные данные
Выведите σ0(n) и σ1(n).
Знаю, что можно решить проще, без затрагивания темы простых делителей. Но на курсе в сириусе даются именно эти формулы:
0) n=p1^α1 * p2^α2 *…ps^as , где p1<p2<⋯<ps — простые числа, а α1,α2,…,αs — натуральные числа.
1) σ0(n)=(α1+1)(α2+1)…(αs+1).
2)σ1(n)=(1+p1+p1^2+…+p1^a1)(1+p2+…+p2^α2)…(1+ps+…+ps^αs)
Код рабочий. По крайней мере Сириус высказал возмущение не к неисправности, а к высокой длительности. Как ускорить алгоритм?
Python | ||
|
Добавлено через 42 минуты
Пришла идея вместо функций использовать решето Эратосфена. Мне кажется, что я некорректно вшил его в код. Но не смотря на это мои простенькие примеры, он решал достаточно быстро, и вполне корректно. Сдал Сириусе, теперь не жалуется на длительность, говорит, что алгоритм выдаёт неправильные ответы. Сам код:
Python | ||
|
0
script1adsense2code
script1adsense3code
Python Math: упражнение 15 с решением
Напишите программу на Python, которая возвращает сумму всех делителей числа.
Пример решения : —
Код Python:
def sum_div(number):
divisors = [1]
for i in range(2, number):
if (number % i)==0:
divisors.append(i)
return sum(divisors)
print(sum_div(8))
print(sum_div(12))
Пример вывода:
7 16
Иллюстрированная презентация:
Блок — схема:
Визуализируйте выполнение кода Python:
Следующий инструмент визуализирует, что компьютер делает шаг за шагом при выполнении указанной программы:
Редактор кода Python:
Есть другой способ решить это решение? Внесите свой код (и комментарии) через Disqus.
Предыдущий: Напишите программу на Python для суммирования всех дружных чисел от 1 до указанных чисел.
Далее: Напишите программу на Python для печати всех перестановок данной строки (включая дубликаты).