• Как идентифицировать переход результата от положительных значений в отрицательные?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    while d >= -xx:
        
        d = x - y
        if d < 0 and d + y > 0:
            print('нашел')
        x = d
        
        print(d)
    Ответ написан
    4 комментария
  • Скрипт не принимает входящие данные.Как переделать что бы работало?

    chupasaurus
    @chupasaurus
    Сею рефлекторное, злое, временное
    Вы передаёте в основную функцию sys.argv, но внутри не используете, поэтому у вас ничего не делающие s = s.
    Если вы хотели, чтобы скрипт использовал значения, заданные вне функций, то их и передавайте как аргументы, т.е.
    так
    #вместо def main(argv):
    def main(s,n,k,a_ext):
        a = [] #копируем содержимое из списка во внутренний
        for i in range(n):
            a.append(a_ext[i])
        
        Making(a, k, 0, s, "%d=" % s)
        return 0
    
    ...
    if __name__ == "__main__":
        main(s,n,k,a)
    Ответ написан
  • Почему код разбиения на слагаемые не работает?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Во-первых, "слагаемые".
    Во-вторых, почитайте код вашей рекурсивной функции, он выдаёт количество, а не сами варианты сложения. Если не можете это понять из кода, то вам рано такие задачи. Серьёзно.
    А ошибка у вас из-за того, что такой алгоритм упирается в размер максимальной глубины рекурсии. Если хотите такие значения считать, делайте итеративный алгоритм, а не рекурсивный. Если эти слова тоже для вас новые, то надо браться за учебник, эта задача слишком сложна будет для вас.
    Успехов.
    Ответ написан
    Комментировать
  • Как найти слагаемые числА, используя только слагаемые из списка?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Для двух слагаемых всё элементарно.
    Сортируем массив, ставим указатели на первый и последний элементы.
    Если сумма элементов равна требуемой, то мы нашли нужную пару.
    Если меньше, то сдвигаем левый указатель вправо.
    Если больше, то сдвигаем правый указатель влево.
    Если указатели сошлись, то подходящей пары нет.
    Ответ написан
    Комментировать
  • Как найти слагаемые числА, используя только слагаемые из списка?

    Vindicar
    @Vindicar
    RTFM!
    Я бы решал задачу рекурсией.
    У тебя есть два варианта.
    а) Раскладываемое число есть в списке. Тогда это число и будет единственным слагаемым.
    б) Раскладываемого числа нет в списке. Тогда последовательно перебирай числа из списка, меньшие раскладываемого числа - возможные слагаемые.

    Если нашел такое число, то:
    1. Вычитаешь его из раскладываемого числа
    2. Убираешь из списка его и все более ранние числа.
    3. Пробуешь решить задачу для нового раскладываемого числа и нового списка чисел.
    4. Если решение нашлось, возвращаешь результат выше, добавив к нему то возможное слагаемое, которое ты обрабатывал.

    Т.е., иными словами, у тебя будет функция вида:
    def sum_split(summa: int, candidates: list[int]) -> list[int]:

    Если summa присутствует в candidates, то возвращаешь [summa].
    Иначе перебираешь список candidates, и для каждого числа candidates[i] делаешь рекурсивный вызов
    answer = sum_split(summa - candidates[i], candidates[i+1:])
    .
    Если список answer не пуст, добавляешь к этому списку candidates[i] и возвращаешь его сам.
    А если перебрал весь список и ничего не подошло, возвращаешь пустой список.

    Дальше сам.
    Ответ написан
    3 комментария
  • Можно ли найти все варианты слагаемых числа,что бы слагаемых было ровно 20?

    Stalker_RED
    @Stalker_RED
    Можно. Двадцать единичек, и 445.
    Или 20 нулей и 465, под ваше описание задачи вполне подходит.
    Чётче описываете условие.
    Ответ написан
    Комментировать
  • Удалить из ряда элементы ,как?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Например, вот так:
    def GenerateAll(source, rep):
      for comb in itertools.combinations(range(len(source)), len(source)-len(rep)):
        s = list()
        prev = 0
        for (i, j) in enumerate(comb):
          s.append(source[j]);
        yield "".join(s)


    Обратите внимание, перебираем не сочетания из удаляемых позиций, а из 22 оставляемых (кстати, у вас числа не бьются, 48+22 = 60 != 64). Тут порядок в ответе будет обратный (первая строка будет "xxxxxx...xxxx12..." а не "12..xxx..xx". Если нужен тот же порядок, то будет чуть сложнее:
    def GenerateAll(source, rep):
      for comb in itertools.combinations(range(len(source)), len(rep)):
        s = list()
        prev = 0
        last = 0
        for (i, j) in enumerate(comb):
          while (last < j):
              s.append(source[last]);
              last += 1
          last += 1
        while (last < len(source)):
              s.append(source[last]);
              last += 1
        yield "".join(s)


    Это не самое питонистое решение, возможно в какой-то библиотеке уже есть готовая функция, которая вырезает из строки символы по индексам.
    Ответ написан
    1 комментарий