Цикл while

В языке C++ существует три вида циклов: цикл while c предусловием, цикл while с постусловием, цикл for.

Цикл while ("пока") с предусловием

Цикл while с предусловием позволяет выполнить одну и ту же последовательность действий пока проверяемое условие истинно. При этом условие записывается до тела цикла и проверяется до выполнения тела цикла.

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

Синтаксис цикла while ("пока") c предусловием такой:

while (условие)
{
     блок инструкций
}

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

int i=1;
while (i <= 10)
{
    cout << i * i << endl;
    ++i;
}

В этом примере переменная i внутри цикла изменяется от 1 до 10. Такая переменная, значение которой меняется с каждым новым проходом цикла, называется счетчиком. Заметим, что после выполнения этого фрагмента значение переменной i будет равно 11, поскольку именно при i==11 условие i<=10 впервые перестанет выполняться.

В следующем примере цикл используется для того, чтобы найти количество знаков в десятичной записи целочисленной переменной i.

int Ndigits (int n)
{
    int result = 0;
    while (n != 0)
    {
        result = result + 1;
        n = n / 10;
    }
    return result;
}

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

Цикл while ("пока") с постусловием

Цикл "пока" с постусловием отличается от цикла с предусловием тем, что сначала выполняется блок цикла, а потом проверяется условие. Если условие истинно, то цикл будет выполнен еще раз, и так до тех пор, пока условие будет истинно. Синтаксис цикла с постусловием такой (обратите внимание на обязательную точку с запятой после условия):

do
{
    Блок инструкций
}
while (условие);

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

Упражнения

3A: Минимальный делитель

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

Ввод Вывод
15
3

3B: Список степеней двойки

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

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

Ввод Вывод
50
1 2 4 8 16 32

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

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

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

Ввод Вывод
8
YES
3
NO

3D: Двоичный логарифм

По данному натуральному числу \(N\) выведите такое наименьшее целое число \(k\), что \(2^k\ge N\).

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

Ввод Вывод
7
3

3E: Длина последовательности

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

Числа, следующие за числом 0, считывать не нужно.

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

3F: Сумма последовательности

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

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

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

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

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

3H: Количество четных элементов последовательности

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

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

3I: Максимум последовательности

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

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

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

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

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

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

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

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

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

4C: Второй максимум

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

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

4D: Количество элементов, равных максимуму

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

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

4E: Сумма последовательности - 2

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

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

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

Последовательность Фибоначчи определяется так: \[ \varphi_0=0, \varphi_1=1, ..., \varphi_{n}=\varphi_{n-1}+\varphi_{n-2}. \]

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

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

5A: Максимальное число идущих подряд одинаковых элементов

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

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

5B: Максимальная длина монотонного фрагмента последовательности

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

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

5C: Количество локальных максимумов последовательности

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

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

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

5D: Наименьшее расстояние между двумя строгими локальными максимумами

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

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

5E: Стандартное отклонение

Дана последовательность натуральных чисел \(x_1\), \(x_2\), ..., \(x_n\). Стандартным отклонением называется величина \[ \sigma = \sqrt{\frac{(x_1-s)^2+(x_2-s)^2+\ldots+(x_n-s)^2}{n-1}} \] где \(s=\frac{x_1+x_2+\ldots+x_n}{n}\) — среднее арифметическое последовательности.

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

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