А409

Задача.

Дана действительная квадратная матрица порядка [latex]9[/latex]. Вычислить сумму тех из её элементов, расположенных на главной диагонали и выше неё, которые превосходят по величине все элементы, расположенные ниже главной диагонали. Если на главной диагонали и выше неё нету элементов с указанным свойством, то ответом должно служить сообщение об этом.

Решение.

  1. Находим наибольший из нижних элементов (элементы, расположенные ниже главной диагонали).
  2. Сравниваем каждый элемент верхнего множества (элементы, расположенные выше главной диагонали и на самой диагонали) с наибольшим элементом ( bottomMax ) из всех нижних элементов и если это число больше, то прибавляем это число к переменной totalSumm.

Код:

Ссылка на решение задачи.

Cсылка на условие задачи.

e-olymp 388. Превращение

Условие

Возьмем какое-нибудь натуральное число [latex]n[/latex]. Будем изменять его следующим образом: если число четное, то разделим его на [latex]2[/latex], если нечетное, прибавим [latex]1[/latex]. После нескольких таких изменений мы всегда получаем число [latex]1[/latex]. Например, из числа [latex]11[/latex] получается число [latex]12[/latex], затем [latex]6[/latex], [latex]3[/latex], [latex]4[/latex], [latex]2[/latex] и, наконец, [latex]1[/latex]. Таким образом, для получения [latex]1[/latex] из [latex]11[/latex] нужно проделать [latex]6[/latex] изменений.
Напишите программу, которая считывает натуральное число и выводит количество изменений данного числа до получения [latex]1[/latex].

Код

Решение

  • Цикл начинается со значением счетчика 0, так как возможны случаи, когда операций над [latex]n[/latex] вообще не нужно будет производить (конкретно — при [latex]n=1[/latex]).
  • Поскольку нам гарантируют, что входное число [latex]n[/latex] — натуральное, то цикл будет работать до тех пор, пока [latex]n>1[/latex]
  • После каждой итерации значение счетчика будет увеличено на [latex]1[/latex].
  • В теле цикла мы проверяем чётность числа [latex]n[/latex] путём проверки остатка от деления [latex]n[/latex] на [latex]2[/latex]. Если остаток равен 0, то число чётное, в противном случае — нечётное. По результату проверки [latex]n[/latex] может быть преобразовано двумя способами:
    • если [latex]n[/latex] — нечетное, то значение [latex]n[/latex] увеличивается на [latex]1[/latex];
    • в противном случае [latex]n[/latex] делится на [latex]2[/latex].

Реализуем описанный алгоритм, после которого отправляем на печать значение счетчика

Ссылка на решение задачи

Ссылка на условие задачи

А34а. Максимум из трёх

Задача.

Даны действительные числа  [latex]x, y, z[/latex]. Получить  [latex]\max\left\{x,y,z \right\}[/latex].

Код:

Решение.

  1. Как известно, для любых чисел  [latex] x,y \in \mathbb{R} [/latex]    [latex] \max\left\{x,y \right\} = x,[/latex]  если  [latex] x \geq y[/latex], и  [latex] \max\left\{x,y \right\} = y,[/latex]  в противном случае.
  2. Нетрудно доказать, что  [latex] \forall x,y,z \in \mathbb{R} [/latex]    [latex] \max\left\{x,y,z \right\}=\max\left\{\max\left\{x,y \right\},z \right\}[/latex]
  3. С учётом замечания  1 проверим неравенство   [latex] x > y[/latex] и если оно выполняется, перенаправим поток на вывод [latex] \max\left\{x,z \right\}[/latex]. В противном случае, на вывод [latex] \max\left\{y,z \right\}[/latex]

Ссылка на решение задачи.

Cсылка на условие задачи.

e-olymp 935. Разложение трицифрового числа

Задача

Разложить заданное трицифровое число на цифры.

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

В единственной строке задано целое трицифровое число.

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

Вывести каждую цифру в новой строке. Порядок вывода приведён в примере.

Код:

  1. Для получения первой цифры числа, делим входное число на 100, результат преобразуем из  Float  в Int  с  помощью  Std.int(x: Float): Int
  2. Для получения второй цифры делим входное число на 10, преобразуем из  Float  в Int (см. пункт 1), находим от полученного двузначного целого числа остаток от деления на 10 с помощью оператора % , что и будет второй цифрой числа.
  3. 3-й цифрой будет остаток от деления всего входного числа на 10 (см. пункт 2).

Ссылка на решение задачи.

Cсылка на условие задачи.

2.2 Обнуляемые типы

Определение: Nullable (обнуляемый)
Тип в Haxe считается обнуляемым, если null является допустимым значением для него.

Обычно языки программирования имеют единое и весьма конкретное определение допустимости нулевых значений. Однако, Haxe вынужден искать в этом вопросе компромисс в связи с различной природой языков на которые будет транслироваться программ (будем называть такие языки целевыми). В то время, как некоторые из целевых языков допускают (и фактически используют как значения по умолчанию) null-значения, все остальные вообще не допускают null-значений для некоторых типов. Это требует разделения целевых языков на 2 группы по типизации:

  • Определение: Статические целевые языки.
    Статическими будем называть целевые языки, использующие статическую типизацию. Это группа языков, в которых переменные связываются с определенным типом данных в момент объявления. Таковыми являются, например, Flash, C++, Java, C#.
  • Определение: Динамические целевые языки.
    Динамическими назовем те целевые языки для которых характерна динамическая типизация. Это группа языков, в которых переменные связываются с типом данных в момент присваивания им значения. Это, например, JavaScript, PHP, Neko, Flash 6-8.

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

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

Определение: Значения по умолчанию.
В языках со статической типизацией базовые типы имеют следующие значения по умолчанию:

  • Int: 0
  • Float: NaN на Flash, 0.0 на остальных статических целях
  • Bool: false

Как следствие, компилятор Haxe не допускает присваивания null базовым типам в языках со статической типизацией. Чтобы сделать допустимым такое присваивание необходимо обернуть базовый тип следующим образом Null<T>:

Таким же образом, базовые типы не могут быть сравнимы с null, если они не обёрнуты должным образом:

Это ограничение распространяется на все ситуации, где работает унификация.

На языках со статической типизацией  Null<T>, Null<Bool>, Null<Float> могут быть использованы чтобы сделать допустимым null-значения. На языках с динамической типизацией это не будет иметь эффекта. Null<T> также может быть использовано с другими типами данных для указания того, что null-значение допустимо.

Если null-значение будет «скрыто» Null<T> или динамической типизацией, при присваивании базовому типу будет использовано значение по умолчанию:

Подготовлено по материалам раздела Nullability официального учебника языка Haxe.