Цикл while

Назад в начало

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

i = 0
while i < 5:
    print(i)
    i += 1

# Вывод:
>>> 0
>>> 1
>>> 2
>>> 3
>>> 4

Цикл while и цикл for имеют схожую структуру, НО есть одно важное различие - цикл while может быть бесконечным.

i = 0
while True:
    print(i)
    i += 1

# Вывод:
>>> 0
>>> 1
>>> 2
>>> 3
>>> 4
# Это может продолжаться долго...

Код выше будет бесконечно печатать возрастаютщую последовательность чисел.

Цикл while можно сравнить с цикличным условным оператором.

text = 'Hello world'
i = 0
while i < len(text):
    print(text[i])
    i += 1

# Вывод:
>>> H
>>> e
>>> l
>>> l
>>> o
>>>
>>> w
>>> o
>>> r
>>> l
>>> d

Код, приведенный выше, печатает строку посимвольно. Приведу пример аналогичного цикла for:

text = 'Hello world'
for i in text:
    print(i)

# Вывод:
>>> H
>>> e
>>> l
>>> l
>>> o
>>>
>>> w
>>> o
>>> r
>>> l
>>> d

Более того, я приведу даже два цикла for!

text = 'Hello world'
for i in range(len(text)):
    print(text[i])

Напомню, что отличие между двумя, приведенными выше примерами, в следующем: первый цикл проходит по элементам последовательности (в нашем случае строки), а второй — по ее индексам. Здесь также используется функция len(), которая позволяет узнать длину последовательности.

Вернемся к циклу while. Цикл while, как и цикл for, можно остановить с помощью специальной управлющей конструкции break.

j = 0
while True:
    if j == 3:
        print('Выход из цикла')
        break
    print(j)
    j += 1

# Вывод:
>>> 0
>>> 1
>>> 2
>>> Выход из цикла

Конструкция break прерывает цикл. Она очень похожа на обычное условие после ключевого слова while.

Так же есть еще одна управляющая конструкция - continue. С ее помощью мы можем не выпонять текущую итерацию (повторение) цикла и перейти сразу к следующему.

j = 0
while j < 5:
    j += 1
    if j == 3:
        print('Пропускаем j == 3')
        continue
    print(j)

# Вывод:
>>> 1
>>> 2
>>> Пропускаем j == 3
>>> 4
>>> 5

Как и для цикла for, для цикла while мы можем записать конструкцию else.

from random import randint
j = 0
element = randint(0, 15)
while j < 10:
    j += 1
    if j == element:
        print('Нашли element, он равен', element)
        break
else:
    print('Неудачная попытка')

Примеры решения задач

Возведение числа в степень с помощью цикла while

n = int(input()) # число
k = int(input()) # степень
i = 1 # текущая степень
result = 1
while i <= k:
    result *= n
    i += 1
print(result)

Сумма последовательности с помощью цикла while

n = int(input())
result = 0
i = 0
while i <= n:
    result += i
    i += 1
print(result)

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

i = 0
while True:
    n = input()
    if n == 'end':
        print('Ввод закончен')
        print('Было введено', i, 'чисел')
        break
    n = int(n)
    i += 1

Сумма введенных чисел

i = 0
summa = 0
while True:
    n = input()
    if n == 'end':
        print('Ввод закончен')
        print('Было введено', i, 'чисел')
        print('Их сумма равна', summa)
        break
    n = int(n)
    summa += n
    i += 1

Решение задач

1. Дано положительное число N. Вывести все числа от 0 до N с помощью цикла while.

2. Дано положительное число N. Вывести все числа от N до 0 с помощью цикла while. Пример:

Ввод: N = 10
Вывод: 10
        9
        8
        7
        6
        ...
        0

3. Даны два положительных числа K и N (K < N). Вывести все числа от K до N с помощью цикла while.

4. Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A (взятие остатка A % B)

5. Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти количество отрезков B, размещенных на отрезке A (деление нацело A // B)

6. Дано положительное число N. Найти сумму всех четных чисел от 0 до N с помощью цикла while.

7. Даны два положительных числа K и N (K < N). Найти сумму всех нечетных чисел от K до N с помощью цикла while.

8. Дано положительное число N. Найти факториал числа N. Факториалом числа называется произведение всех чисел от 1 до N. Например, факториал числа 5 равен 5! = 1*2*3*4*5 = 120, 2! = 1*2 = 2, 9! = 1*2*3*4*5*6*7*8*9 = 362880

9. Дано целое число N (> 0). Если оно является степенью числа 3, то вывести YES, если не является - вывести NO.

10. Дано целое число N (> 0). Найти двойной факториал N: N!! = N * (N-2) * (N-4)* .... Для решения этой задачи посмотрите на задачу 2

Сложные задачи

1. Дано целое число N (> 1). Найти наименьшее целое число K, при котором выполняется неравенство 3^K > N, где 3^K - это 3 в степени K или число 3, умноженное само на себя K раз. Например, 3^5 = 3*3*3*3*3. Ответом в задаче будет первая степень числа 3, которая больше, чем заданное число N. Например, если N=41, распишем степени числа три: 3^1 = 3; 3^2 = 3*3 = 9; 3^3 = 3*3*3 = 27; 3^4 = 3*3*3*3 = 27 * 3 = 81;. Таким образом, первая степень, в которую возвести число 3, превышающая число N - это 4.
В этой задаче нужно выполнять цикл while, пока остаток от деления на число три равен 0

2. Дано целое число N (> 0). Используя операции деления нацело и взятия остатка от деления, вывести все его цифры, начиная с самой правой (разряда единиц).
Перед решением этой задачи вспомните, как найти сумму цифр трехначного числа.

3. Даны целые положительные числа A и B. Найти их наибольший общий делитель (НОД), используя алгоритм Евклида: НОД(A, B) = НОД(B, A mod B), если B = 0; НОД(A, 0) = A.

4. Спортсмен-лыжник начал тренировки, пробежав в первый день 10 км. Каждый следующий день он увеличивал длину пробега на P процентов от пробега предыдущего дня (P — вещественное, 0 < P < 50). По данному P определить, после какого дня суммарный пробег лыжника за все дни превысит 200 км, и вывести найденное количество дней K (целое) и суммарный пробег S (вещественное число).

5. Дано целое число N (> 1). Последовательность чисел Фибоначчи FK определяется следующим образом: F(1) = 1, F(2) = 1, F(K) = F(K-2) + F(K-1), K = 3, 4, .... Проверить, является ли число N числом Фибоначчи. Если является, то вывести TRUE, если нет - вывести FALSE.

6. Даны положительные числа A, B, C. На прямоугольнике размера A x B размещено максимально возможное количество квадратов со стороной C (без наложений). Найти количество квадратов, размещенных на прямоугольнике. Операции умножения и деления не использовать.

7. Дано целое число N (> 1), являющееся числом Фибоначчи: N = F(K). Найти целое число K - порядковый номер числа Фибоначчи N.