К содержанию

Анатолий
Анатольевич
Eфремов

Цикл while


Цикл while

Цикл while («пока») — это так называемый цикл с условием или с предусловием. В цикле for мы явно указываем, какие значения будет принимать переменная i, например, 1 <= i <= 10. В цикле while можно задавать более сложные условия, например, i ^ 2 <= 10, кроме того можно использовать логические операции «И», «ИЛИ» и т.д.

Цикл while позволяет выполнить одну и ту же последовательность действий, пока проверяемое условие истинно. Условие записывается до тела цикла и проверяется до выполнения тела цикла. Как правило, цикл while используется, когда невозможно определить точное значение количества проходов исполнения цикла.

Синтаксис цикла while в простейшем случае выглядит так:

while условие:
     блок инструкций

При выполнении цикла while сначала проверяется условие. Если оно ложно, то выполнение цикла прекращается, и управление передаётся на следующую инструкцию после тела цикла while.
Если условие истинно, то выполняются все инструкции из блока, после чего условие проверяется снова, и снова выполняется блок инструкций. Так продолжается до тех пор, пока условие будет истинно.
Как только условие становится ложным, работа цикла завершается, и управление передаётся следующей инструкции после цикла.


Пример:

Следующий фрагмент программы напечатает на экран все целые числа, не превосходящие n, и их сумму:

s = 0
i = 1
while i <= n:
     print(i)
     s += i
     i += 1
print(s)


Пример:

C предыдущей задачей однако мог бы справиться и цикл for. Рассмотрим более сложную задачу, с которой for уже не справится: вывести на экран все степени двойки, не превосходящие 100. Её также удобно решать с помощью цикла while.

i = 1
while i <= 100:
     print(i)
     i *= 2

После окончания цикла значение i будет уже больше, чем 100, иначе цикл бы продолжился. Последнее напечатанное значение будет соответственно равно 64.


Пример:

Немного изменим задачу: найдём максимальную степень двойки, не превосходящую 100.

p = 1
while p * 2 <= 100:
     p *= 2
print(p)

После окончания цикла значение переменной p будет максимальной степенью двойки, не превосходящей 100, потому что на следующем шаге условие уже не будет выполняться.


Пример:

Вот еще один пример использования цикла while для определения количества цифр натурального числа n и их суммы:

s = 0
n = int(input())
count = 0
while n > 0:
     count += 1
     s += n % 10
     n //= 10
print(count)
print(s)

В этом цикле мы отбрасываем по одной цифре числа, начиная с конца, что эквивалентно целочисленному делению на 10 (n //= 10), при этом считаем в переменной count, сколько раз это было сделано, а в переменной s — сумму отброшенных цифр.



Задача *

Трискайдекафобия

Трискайдекафобия — боязнь числа 13. В особо сложных формах пациент боится и всех чисел, кратных 13.

Дано число N. Выведите все целые числа по возрастанию, начиная с числа N, пока не встретится число, кратное 13. Его выводить не нужно.

Входные данные

Дано натуральное число N, не превосходящее 10000.

Выходные данные

Выведите ответ на задачу.

Примечание

Программа должна быть решена при помощи одного цикла while, без if внутри цикла.

Примеры

Ввод Вывод
20 20
21
22
23
24
25

Видеоразбор

ОТВЕТ:
n = int(input())
while n % 13 != 0:
     print(n)
     n += 1



Задача 1

Номер числа Фибоначчи

Последовательность Фибоначчи определяется так:

φ0 = 0, φ1 = 1, φn = φn - 1 + φn - 2

Дано натуральное число A. Определите, каким по счету числом Фибоначчи оно является, то есть выведите такое число n, что φn = A. Если A не является числом Фибоначчи, выведите число -1.

Входные данные

Вводится натуральное число A (2 ⩽ A ⩽ 2 ⋅ 109).

Выходные данные

Выведите ответ на задачу.

Примеры

Ввод Вывод
8 6

Ввод Вывод
10 -1

ОТВЕТ:
f = 0
f1 = 1
f2 = 0
i = 0
n = int(input())
while f <= n:
     f = f1 + f2
     f1, f2 = f, f1
     i += 1
if n == f2:
     print(i)
else:
     print(-1)



Задача 2

Точная степень двойки

Дано натуральное число N. Выведите слово YES, если число N является точной степенью двойки, или слово NO в противном случае.

Операцией возведения в степень пользоваться нельзя!

Входные данные

Вводится натуральное число, не превосходящее 200.

Выходные данные

Выведите ответ на задачу.

Примеры

Ввод Вывод
8 YES

Ввод Вывод
3 NO

Ввод Вывод
1 YES

ОТВЕТ:
n = int(input())
i = 1
while i < n:
     i = i * 2
if i == n:
     print("YES")
else:
     print("NO")



Задача 3

Банковские проценты

Вклад в банке составляет x рублей. Ежегодно он увеличивается на p процентов, после чего дробная часть от копеек отбрасывается. Определите, через сколько лет вклад составит не менее y рублей. В задаче запрещено использовать дробные числа.

Входные данные

Программа получает на вход три натуральных числа: x, p, y (x ⩽ 2000, p ⩽ 100, y ⩽ 2000).

Выходные данные

Программа должна вывести одно целое число — ответ на задачу.

Примечание

Обратите внимание, что вклад в банке измеряется в рублях, а отбрасывается дробная часть копеек.

Примеры

Ввод Вывод
100
10
200
8

ОТВЕТ:
x = int(input()) * 100
p = int(input())
y = int(input()) * 100
i = 0
while x < y:
     x += int(p * x / 100)
     i += 1
print(i)



Задача 4

Минимальный простой делитель

Дано целое число, не меньшее 2. Выведите его наименьший простой делитель.

Входные данные

Вводится целое положительное число N ⩽ 2 ⋅ 109.

Выходные данные

Выведите ответ на задачу.

Примеры

Ввод Вывод
15 3

Ввод Вывод
179 179

ОТВЕТ:
n = int(input())
i = 2
while i * i <= n:
     if n % i == 0:
          print(i)
          break
     i += 1
if i * i > n:
     print(n)



Задача 5

Список квадратов

По данному целому числу N распечатайте все квадраты натуральных чисел, не превосходящие N, в порядке возрастания.

Входные данные

Вводится натуральное число, не превосходящее 100.

Выходные данные

Выведите ответ на задачу.

Примеры

Ввод Вывод
50 1 4 9 16 25 36 49

ОТВЕТ:
x = int(input())
i = 1
while i * i <= x:
     print(i * i, end=' ')
     i += 1



Обработка последовательностей неизвестной длины



Обработка последовательностей неизвестной длины

С помощью цикла for мы могли решать задачи, обрабатывающие последовательности числовых данных, например, посчитать сумму или произведение элементов некоторой последовательности с известным числом элементов.

Однако бывают случаи, когда заранее неизвестно число элементов последовательности, а ввод ограничен тем или иным образом. С использованием цикла while можно решать задачи для этого случая. Рассмотрим пример такой задачи.


Пример:

Дана последовательность натуральных чисел, заканчивающаяся нулем. Требуется найти произведение и количество этих чисел (ноль не должен участвовать в нахождении произведения).

Решение может выглядеть так:

count = 0
prod = 1
elem = int(input())
while elem != 0:
     count += 1
     prod *= elem
     elem = int(input())
print(prod)
print(count)

Рассмотрим более сложную задачу.


Пример:

Дана последовательность неизвестной длины, требуется вывести первое число, которое встречается два раза подряд. Гарантируется, что такое число существует.

Для решения задачи потребуется хранить не только текущее считанное значение, но и предыдущее:

prev = int(input())
elem = int(input())
while elem != prev:
     prev = elem
     elem = int(input())
print(elem)



Задача *

Второй минимум

Последовательность состоит из натуральных чисел и завершается числом 0. Определите значение второго минимального по величине элемента в этой последовательности, то есть элемента, который будет наименьшим, если из последовательности удалить наименьший элемент.

Последнее число 0 не учитывается. Гарантируется, что в последовательности есть хотя бы два элемента (кроме завершающего числа 0).

Входные данные

На вход подаётся последовательность целых неотрицательных чисел, заканчивающаяся нулём. Все числа в последовательности неотрицательные, по значению не превосходящие 109.

Выходные данные

Выведите ответ на задачу.

Примеры

Ввод Вывод
1
7
9
0
7

Ввод Вывод
3
2
2
1
1
0
1

Видеоразбор

ОТВЕТ:
min1 = 10 ** 9
min2 = 10 ** 9
elem = int(input())
while elem != 0:
     if elem < min1:
          min2 = min1
          min1 = elem
     elif elem < min2:
          min2 = elem
     elem = int(input())
print(min2)



Задача 6

Количество элементов, которые больше предыдущего

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

Входные данные

Вводится последовательность натуральных чисел, оканчивающаяся числом 0 (само число 0 в последовательность не входит, а служит как признак её окончания).

Выходные данные

Выведите ответ на задачу.

Примеры

Ввод Вывод
1
7
9
0
2

ОТВЕТ:
elem = int(input())
i = 0
while elem != 0:
     f = int(input())
     if f != 0 and elem < f:
          i += 1
     elem = f
print(i)



Задача *

Количество локальных максимумов

Элемент последовательности называется строгим локальным максимумом, если он строго больше предыдущего и последующего элементов последовательности. Первый и последний элемент последовательности не являются локальными максимумами.

Входные данные

Дана последовательность натуральных чисел, завершающаяся числом 0. Гарантируется, что все числа не превосходят 100.

Выходные данные

Определите количество строгих локальных максимумов в этой последовательности.

Примеры

Ввод Вывод
5
0
0

Ввод Вывод
1
2
0
0

Ввод Вывод
2
1
0
0

Видеоразбор

ОТВЕТ:
elem = int(input())
prev1 = elem
prev2 = elem
count = 0
while elem != 0:
     if prev1 > prev2 and prev1 > elem:
          count += 1
     prev2 = prev1
     prev1 = elem
     elem = int(input())
print(count)



Задача 7

Среднее значение последовательности

Определите среднее значение всех элементов последовательности, завершающейся числом 0. Сам ноль в последовательность не входит.

Использовать массивы в данной задаче нельзя.

Входные данные

Вводится последовательность целых чисел, оканчивающаяся числом 0 (само число 0 в последовательность не входит, а служит как признак её окончания.

Выходные данные

Выведите ответ на задачу.

Примеры

Ввод Вывод
1
7
9
0
5.66666666667

ОТВЕТ:
elem = int(input())
count = 0
s = 0
while elem != 0:
     s += elem
     count += 1
     elem = int(input())
print(s / count)



Задача *

Самое частое число в последовательности

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

Для решения этой задачи запрещено использование массивов и списков.

Входные данные

На вход подается последовательность натуральных чисел, заканчивающаяся нулём. Его обрабатывать не нужно. Гарантируется, что все числа не превосходят 109.

Выходные данные

Выведите ответ на задачу.

Примеры

Ввод Вывод
4
6
6
2
6
0
6

Видеоразбор

ОТВЕТ:
ans = 0
count = 0
elem = int(input())
while elem != 0:
     if count == 0:
          ans = elem
          count = 1
     elif elem == ans:
          count += 1
     else:
          count -= 1
     elem = int(input())
print(ans)



Задача *

Выдача сдачи

Имеется неограниченное количество монет в 1, 2, 5, 10 рублей. Определите, сколькими способами можно выдать сдачу в n рублей. Например, 5 рублей можно выдать четырьмя способами: 5 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 + 1 + 1 + 1.

Входные данные

Программа получает на вход натуральное число n, не превышающее 100.

Выходные данные

Выведите ответ на задачу.

Примеры

Ввод Вывод
2 2

Ввод Вывод
5 4

ОТВЕТ:
s = int(input())
cnt = 0
for a in range(11):
     for b in range(21):
          for c in range(51):
               for d in range(101):
                    if a * 10 + b * 5 + c * 2 + d == s:
                         cnt += 1
print(cnt)



Задача *

Выдача сдачи — 2

Имеется неограниченное количество монет в 1, 2, 5, 10 рублей. Определите, сколькими способами можно выдать сдачу в n рублей. Например, 5 рублей можно выдать четырьмя способами: 5 = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 + 1 + 1 + 1.

Входные данные

Программа получает на вход натуральное число n, не превышающее 106.

Выходные данные

Выведите ответ на задачу.

Примечание

Правильное решение задачи можно написать, используя всего один цикл while.

Примеры

Ввод Вывод
2 2

Ввод Вывод
100000 1667116705001

Видеоразбор

ОТВЕТ:
s = int(input())
ans = 0
s5 = 0
while s5 <= s:
     s1 = s - s5
     ans += (s1 // 2 + 1) * (s5 // 10 + 1)
     s5 += 5
print(ans)