Skip to main content

17. Цикл while

Теория

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

Такую конструкцию называют циклами while. Общий вид таких циклов:

while(условие){
делать_пока_правда
}

Пока истинно логическое выражение, указанное в скобках цикла while. Всё, что указано в теле цикла (между фигурными скобками {...}).

Попробуем решить следующую задачу:

На вход подаются целые числа, пока не будет введено отрицательное.

Требуется вывести сумму всех чисел.

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int sum = 0;
while(a>0){
sum+=a;
a = sc.nextInt();
}
sum+=a;
System.out.println(sum);
}
}

Очевидно, что условие цикла - это a>0, т. к. после чтения отрицательного числа, нам читать числа больше не надо.

Чтобы посчитать сумму, надо ввести какую-то переменную. Мы назвали её sum.

Внутри цикла while мы прибавляем к переменной sum каждое прочитанное значение.

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

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

Такой цикл есть. Он называется цикл с постусловием do...while

do{
тело_цикла;
}while(условие);

Циклы с постусловием работают по следующему принципу: тело цикла гарантированно выполняется хотя бы один раз. Если условие верно, то тело цикла повторяется. Обратите внимание, что после while(условие) ставится «;»

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

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

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int sum = 0;
do{
a = sc.nextInt();
sum+=a;
}while(a>0);
System.out.println(sum);
}
}

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

Задание

В этом задании циклами можно пользоваться только если этот цикл - while.

  1. Дано целое положительное число NN. Найти наибольшее целое число KK, квадрат которого не превосходит N: K2NN:~ K^2 \leq N. Функцию извлечения квадратного корня не использовать.
  2. Дано целое число N (N>1)N~ (N> 1). Найти наименьшее целое число KK, при котором выполняется неравенство 3KN3K \ge N. Операцией деления пользоваться запрещается.
  3. Дано целое положительное число NN, являющееся некоторой степенью числа 2: N=2K2:~ N = 2^K. Найти целое число K<263K<2^{63} - показатель этой степени. Функцией взятия логарифма пользоваться запрещается.
  4. Дано число A (A>1)A~ (A> 1). Вывести наименьшее из целых чисел KK, для которых сумма 1+12+23+...K1K1 + \frac{1}{2} + \frac{2}{3} + ... \frac{K-1}{K} будет больше AA, и саму эту сумму.
  5. Дано целое положительное число NN. Используя операции деления нацело и взятия остатка от деления, вывести все его цифры, начиная с самой правой (разряда единиц). Строками пользоваться запрещается.
  6. Дано целое положительное число NN. С помощью операций деления нацело и взятия остатка от деления определить, имеется ли в записи числа NN цифра 22. Если имеется, то вывести ДА, если нет - вывести НЕТ.
  7. Начальный вклад в банке равен 10001000 руб. Через каждый месяц размер вклада увеличивается на PP процентов от имеющейся суммы (PP - вещественное число, 0<P<250 \lt P \lt 25). По данному PP определить, через сколько месяцев размер вклада превысит 1100 руб., и вывести найденное количество месяцев KK (целое число) и итоговый размер вклада SS (вещественное число).

Ссылка на контест