Есть ли какой-нибудь способ использовать меньше памяти и сократить время выполнения?

#python #python-3.x

#python #python-3.x

Вопрос:

вот подсказка: постройте числовой треугольник в соответствии со следующими правилами:

  1. первая строка содержит начальный номер
  2. каждая из новых строк имеет на одно число больше, чем предыдущее
  3. каждое число — это указанное большее количество, чем последнее
  4. перед добавлением в «треугольник» убедитесь, что все символы многозначных чисел складываются вместе, образуя однозначное число
  5. возвращает сумму последней строки в «треугольнике»

вот мой ответ: первая функция выполняет четвертое требование, она добавляет цифры числа до тех пор, пока не останется только одна цифра. пример: 123 = 1 2 3 = 6. Вторая функция принимает s (начальное значение), d (приращения) и r (количество строк). Он создает boxnum, который представляет собой общее количество ячеек в треугольнике и сколько раз я должен добавить приращение к предыдущему значению. если r = 99 999, весь код будет повторяться столько раз, и это превысит ограничение по времени, что является моей проблемой. у меня также есть проблема с хранилищем, потому что каждое значение добавляется в список, когда на самом деле мне нужна только последняя строка. Я не уверен, как переписать и сократить свой код.

 def multidigit(x):
  numsum = 0 
  if x < 9:
    return(x)
  else:
    for number in str(x):
      numsum  = int(number)
    if numsum > 9:
      return(multidigit(numsum))
    else:
      return(numsum)

def sumOfLastRow(s, d, r):
  rowslist = []
  rowslist.append(multidigit(s))
  incrementnum = s
  boxnum = 0
  for i in range(r 1):
    boxnum = boxnum   i
  for i in range(boxnum-1):
    incrementnum = incrementnum   d
    if incrementnum > 9:
      incrementnum = multidigit(incrementnum)
    rowslist.append(incrementnum)
  splitlist = rowslist[-r:]
  rowslist.clear()
  total = 0
  for i in range(len(splitlist)):
    total = total   splitlist[i]
  return(total)
 

Ответ №1:

 if x < 9:
    return(x)
 

Это выглядит неправильно.
Вероятно, вы начали с ошибки бесконечного цикла в случае x == 9,
а затем добавили финал else , чтобы исправить его.
Бьюсь об заклад, вы хотели

 if x <= 9:
    return int(x)
 

Намного проще

 return sum(map(int, str(x)))
 

Вы могли бы использовать аналогичную идиому при вычислениях total .


 for i in range(r 1):
    boxnum = boxnum   i
 

Здесь нет необходимости в цикле, поскольку доступно решение в квадратичной замкнутой форме.
https://dev.to/alisabaj/the-gauss-sum-and-solving-for-the-missing-number-996