Задать вопрос
@Udozer

Как ускорить выполнение перебора?

Короче, у меня есть задача на CodeWars-е нужно написать функцию, которая проверяет можно ли собрать это число из других более мелких в кубе. У меня получилось написать переборный алгоритм, но совсем огромные числа, она очень долго перебирает. Поэтому прошу у вас помощи с этим, можно ли как то ускорить проверку.
Далее будет задача, на английском:
Your task is to construct a building which will be a pile of n cubes. The cube at the bottom will have a volume of n^3, the cube above will have volume of (n-1)^3 and so on until the top which will have a volume of 1^3.

You are given the total volume m of the building. Being given m can you find the number n of cubes you will have to build?

The parameter of the function findNb (find_nb, find-nb, findNb, ...) will be an integer m and you have to return the integer n such as n^3 + (n-1)^3 + ... + 1^3 = m if such a n exists or -1 if there is no such n.
def find_nb(m):
    summa = [n**3 for n in range(1,100_000)]
    for i in range(len(summa)):
        if sum(summa[:i])==m:return i
    return -1
  • Вопрос задан
  • 100 просмотров
Подписаться 1 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Задумайся для начала.
Зачем ты для каждой попытки i заново суммируешь числа от 1 до i-1, если ты уже суммировал их на предыдущей итерации?
Если не осилил

m = .....
n = 0
while m > 0:
    n += 1
    m -= n ** 3
print(n)

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@twistfire92
Python backend developer
1. Откуда у вас взялось число 100000? а если сумма больше?
2. Допустим у вас m=90. Вы пройдете по всем числам до конца, чтобы понять, что ответа нет?

попробуйте так
def find_nb(m):
    summ = 0
    i=0
    while summ != m:
        i+=1
        summ += i**3
        if summ > m:
            return -1
    return i

начинаем с 1 и прибавляем к сумме новый куб пока сумма не станет равна m. А если в какой-то момент сумма стала больше этого числа, то проверять дальше не имеет смысла.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽