аватар question@mail.ru · 01.01.1970 03:00

Цикл while «Сумма последовательности чисел»

Начал изучать питон, иногда нападают жуткие тупняки.
Ряд задач с этим циклом, вроде, решен и понятен,
тут не могу никак понять, как формулировать решение?

Определите сумму всех элементов последовательности, завершающейся числом 0.
В этой и в следующих задачах числа, следующие за нулем, не учитываются.
def по этому курсу еще не было, не знаю, что это.
Т.е. задачу нужно решить в рамках изученного материала:

  1. Ввод-вывод, арифметические операции
  2. Условная инструкция
  3. Операции с целыми и вещественными числами
  4. Цикл for
  5. Строки
  6. Цикл while

Вот просто чего не понял.

i = 0while int(input()) > 0:    i += int(input())print(i)

Но в этом случае суммируются элементы без первого,
т.е. в том порядке, как входят.

Если делаю так,

i = 0a = 0while int(input()) >0:    i += 1 for j in range(0:a):    a += int(input())print(a)

то говорит, что закончились числа для ввода.
Т.е. в целом я понимаю, что вообще что-то не то делаю.

аватар answer@mail.ru · 01.01.1970 03:00

Ошибка в том, что функция input() вызывается в двух местах, нужно вызывать её только в одном месте и использовать одно и то же возвращаемое значение как для проверки на ноль, так и для суммирования:

total = 0 # общая суммаwhile True: # бесконечный цикл    n = int(input()) # каждая строка содержит целое число    if n == 0: # нашли нуль        break  # выходим из цикла    total += n # суммируемprint(total) # печатаем результат

Код предполагает, что каждая последовательность завершается нулём. В противном случае нужно ловить EOFError исключение и обрабатывать возвращаемую пустую строку.

Чтобы самостоятельно найти ошибку в своём коде, в таких простых случаях, полезно выписать словами, что код делает строчка за строчкой (отладка ).


Другие способы выразить то же самое для тестов (и для улучшения понимания задачи людьми, которые уже знают Питон, не для прямого использования):

import sysfrom itertools import takewhileprint(sum(takewhile(lambda n: n != 0, map(int, sys.stdin))))

Не нулевые целые числа являются истиной в булевом контексте в Питоне, поэтому вместо
lambda n: n != 0 можно использовать просто bool (менее читаемый (явный) вариант).

Или даже (если каждая строчка содержит только числа, без пробелов):

print(sum(map(int, iter(input, '0'))))

Последние

Похожие