Задача
Стоимость бутылки воды, учитывая стоимость пустой бутылки, составляет $1$ грн $20$ коп., а стоимость пустой бутылки $20$ коп.
Сколько бутылок воды можно выпить на $n$ грн, учитывая, что пустые бутылки можно сдавать, и на полученные деньги приобретать новые бутылки воды.
Входные данные
Натуральное число $n$ $(1≤n≤1000)$.
Выходные данные
Количество бутылок воды, которое можно выпить на $n$ грн.
Решение
Вводим переменную $n$ равную числу заданных денег. Так как при покупки и возвращении бутылки тратится $1$ грн, количество купленной воды будет на одну меньше, чем количества купюр. Чтобы «избавиться» от монет (десятичной части числа) при получении количества бутылок воды, округляем конвертируем переменную в целочисленный тип с округлением в сторону $0$.
Альтернативный вариант
1
2
3
4
5
6
7
8
9
10
11
classTest{
staticfunctionmain(){
varn=10,i=0;
while(n>1.2)
{
n--;
i++;
}
trace(i);
}
}
Решение
Вводим переменную $n$ равную числу заданных денег и счетчик купленной воды. В цикле отнимаем от переменной $1$, так как при возвращении бутылки тратится лишь $1$ грн, а счетчик купленной воды увеличиваем на $1$.
Часы с боем пробивают каждый час такое количество ударов, сколько их есть на циферблате с цифрами от 1 до 12, и по одному разу тогда, когда минутная стрелка указывает на цифру 6. Зная начальное и конечное время в рамках одних календарных суток (выраженное в часах и минутах), подсчитать общее количество ударов на этом промежутке времени.
Входные данные.
Начальное и конечное время одних календарных суток в часах ($H$) и минутах ($M$) через пробел ([latex]0 \leq H \leq 23, 0 \leq M \leq 59[/latex]).
Выходные данные.
Ответ на задачу.
Тесты
Входные данные
Выходные данные
Начальное и конечное время
Количество ударов
13 30 15 10
7
0 00 23 59
180
12 30 12 30
1
22 22 22 25
0
Код.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
classTest{
staticfunctionmain(){
varoutput=Sys.stdout();
varh1:Int=Std.parseInt(Sys.stdin().readLine());
varm1:Int=Std.parseInt(Sys.stdin().readLine());
varh2:Int=Std.parseInt(Sys.stdin().readLine());
varm2:Int=Std.parseInt(Sys.stdin().readLine());
varres:Int=0;
while((h2*60+m2)-(h1*60+m1)>=0)
{
if(m1==59)
{
h1++;
m1=0;
}
if(m1==30)
{
res++;
}
if(m1==0)
{
res+=h1%12;
}
m1++;
}
output.writeString(res);
}
}
Решение.
Заведем переменную, которая будет отвечать за количество пробитых ударов
res. Если на часах 59 минут, то увеличиваем количество часов
h1, и обнуляем значение минутной стрелки
m1, для следующего круга. Если значение минутной стрелки равно 30 то увеличиваем переменную
res на один. Если же минутная стрелка на 12, то есть 0 минут, то к
res добавляем остаток от деления текущего количества часов на 12. Увеличиваем значение переменной
m1 на 1. Повторяем, пока начальное время не будет совпадать с конечным.
Ссылка на решение задачи на сайте Try Haxe!
Альтернативное решение.
Также существует способ решения этой задачи без использования циклов. Для этого я использовала функцию
FactTree, которая реализует арифметическую прогрессию. Эта функция считает сколько ударов совершили часы от 0 часов, до указанного в качестве параметра времени. Объясним принцип работы функции
ProdTree.Пусть нам нужно найти сумму последовательных чисел от L до R, обозначим его как P(L, R). Разделим интервал от L до R пополам и посчитаем P(L, R) как P(L, M) + P(M + 1, R), где M находится посередине между L и R, M = (L + R) / 2. Заметим, что слагаемые будут примерно одинаковой длины. Аналогично разобьем P(L, M) и P(M + 1, R). Будем производить эту операцию, пока в каждом интервале останется не более двух слагаемых. Очевидно, что P(L, R) = L, если L и R равны, и P(L, R) = L + R, если L и R отличаются на единицу.
Обычный цикл [latex]while[/latex] начинается с ключевого слова [latex]while[/latex], за которым следует открывающая скобка круглая «
(», выражение условия и закрывающая скобка «
)». После этого следует выражение тела цикла.
1
while(condition)expression;
Выражение условия должно быть типа [latex]Bool[/latex].
На каждой итерации оценивается выражение условия. Если оно принимает значение [latex]false[/latex], цикл останавливается, в противном случае он вычисляет выражение тела цикла.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package;
import neko.Lib;
classMain
{
staticfunctionmain()
{
vari:Int=0;// инициализируем счетчик цикла.
varsum:Int=0;// инициализируем счетчик суммы.
while(i<1000)
{
i++;
sum+=i;
}
trace("Sum of number from 1 to 1000 = "+sum);
}
}
Этот вид цикла [latex]while[/latex] не оценивает выражение тела цикла: если условие не выполняется с самого начала, то тело цикла не вычисляется (не выполняется). Этим этот вид отличается от циклов [latex]do-while[/latex].