alarm
Задайте вопрос
Информатика
Andrews

Ввести целое число n. Найти сумму чисел не делящееся на 7, но делящееся на 3 среди чисел [n√n,n^2]. Python

ответы: 1
Зарегистрируйтесь, чтобы добавить ответ
Ответ:

Наивное решение:

n = int(input())

print(sum(filter(lambda x: x%7 != 0 and x%3 == 0, range(int(n**1. 5), n**2+1))))

Бахаем range в нужном диапазоне, фильтруем из него лямбдой числа по условию, складываем и выводим в консоль. Единственный нюанс, что n*sqrt(n) округляется вниз, что может быть проблемой, и тогда можно использовать math. ceil

Главным же минусом его является производительность при переборе "в лоб". На самом деле, решить задачку можно не за O(n^2), а за O(1), если вспомнить про сумму арифметической прогрессии, и про то, как надо вычитать прогрессии с взаимно простыми шагами

Нужно найти сумму прогрессии, попадающую в диапазон, с шагом 3, начиная с делящегося на 3 числа, и вычесть из неё сумму прогрессии с шагом 21, начиная с первого делящегося на 21 числа

Объясняется это тем, что каждое седьмое число из первой прогрессии будет делиться на 7, а раз оно делится и на 3 тоже, то это число, делящееся на 21

Выглядит страшно, но по факту здесь только задача в том, чтоб правильно округлить нижние границы диапазонов - from3 и from21 вверх, а верхние - to3 и to21 - вниз. Зато работает идеально быстро и вообще не зависит от размеров диапазонов (длинная арифметика не в счёт)

import math

n = int(input())

from3 = math. ceil(n**1. 5 / 3) * 3

from21 = math. ceil(n**1. 5 // 21) * 21

to3 = n**2 // 3 * 3

to21 = n**2 // 21 * 21

sum3 = (from3+to3)*((to3-from3)//3+1) // 2

sum21 = (from21+to21)*((to21-from21)//21+1) // 2

print(sum3 - sum21)

443
Dinko
Чтобы ответить необходимо зарегистрироваться.

Другие вопросы: - Информатика

20 Поинтов PythonДавайте напише

Отсортировать по убыванию элемен

На вход алгоритма подаётся натур

7)Камера делает фотоснимки разме

23) Исполнитель Калькулятор прео

посчитайте вообще ничего не пойм

Контакты
Реклама на сайте