@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
  • Вопрос задан
  • 93 просмотра
Решения вопроса 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. А если в какой-то момент сумма стала больше этого числа, то проверять дальше не имеет смысла.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы