e-olymp 441. Наиболее круглое число

Наиболее круглое число

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

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

В первой строке входных данных задано количество чисел [latex]N[/latex] [latex](1  ≤  N  ≤  100)[/latex]. Каждая из последующих N строк содержит одно число в пределах от [latex]1[/latex] до [latex]10^{9}[/latex].

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

Вывести наиболее круглое число среди заданных [latex]N[/latex] чисел.

Тесты

Входные данные Выходные данные
4
71200
10
200
10001
200
5
711
1
2
10001
234567
1
10
7
1
2
1
2
3
4
6
8
9
1
4
100000
200000
500000
800000
100000

Код программы

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

Имеет смысл проверять каждое введенное число: не является ли оно меньше либо равно чем [latex]p[/latex], где [latex]p[/latex] — наименьшее число с количеством нулей равным [latex]maxk[/latex]. [latex]maxk[/latex] — текущее наибольшее количество нулей. Для того, чтобы найти [latex]p[/latex], мы в цикле умножаем [latex]1[/latex] [latex]maxk[/latex]-раз на [latex]10[/latex]. Очевидно, что [latex]p[/latex] нужно менять только тогда, когда меняется [latex]maxk[/latex], также следует до цикла полагать [latex]p[/latex]=1. Для того чтобы [latex]p[/latex] не умножалось на [latex]10[/latex] снова и снова. Таким образом мы отсеиваем заведомо негодные числа и ускоряем код.
Положим [latex]maxn[/latex] — наиболее круглое число.
Так как по условию числа не могут быть больше чем [latex]10^{9}[/latex], имеет смысл изначально поставить переменную [latex]maxn=10^{9}[/latex]. Это делается для того случая, когда во всех числах [latex]m[/latex] не будет нулей и нужно будет выбрать наименьшее. Если мы положим в переменную [latex]maxn[/latex] любое другое число то [latex]maxn[/latex] может быть меньше чем [latex]m[/latex] и мы не сможем выбрать ответ так как все [latex]m[/latex] будут больше его.

Условие задачи на e-olimp
Код решения ideone

5 thoughts on “e-olymp 441. Наиболее круглое число

  1. Если делать большие перерывы в учебе, то навыки теряются и приходится учиться заново. Посмотрите на студентов после академического отпуска — они по 2-3 раза учатся на первом курсе обычно без всякой пользы.
    — Вам заново нужно выяснить для себя, что такое метки (ключевые слова).
    — Отступы в коде на ideone! И что там за странное описание — «яркость»? Орки в Лос-Анджелесе?
    — Код из этой публикации не работает.
    — Уберите кириллицу из постоянной ссылки.
    — Зачем в условном операторе проверять оканчивается ли на ноль, а строчкой ниже проверять это же в цикле? Если условие не выполнится, то и цикл не выполнится.

  2. Обновил предыдущий комментарий и на всякий случай добавлю по Вашем алгоритму:
    — Представьте, что Вы уже нашли число с 12-ю нулями. Но, несмотря на это, будете считать нули в числах, которые короче 12-и знаков. Зачем?
    — Вы считаете количество нулей. На самом деле Вам нужно число из единицы и максимального найденного на данный момент количества нулей (типа m=10…0). Если очередное введенное число будет меньше текущего m, то его можно смело игнорировать. Если же оно больше, либо равно, то можно проверять остаток от деления на него и m*=10. Такой подход позволит отсеять заведомо негодные числа и не делить опять на 10, 100, 1000,… если вы уже давно работаете с огромными круглыми числами.

  3. Стараюсь объяснять на примерах, а выходит частный случай. Когда я написал: «Представьте, что Вы уже нашли число с 12-ю нулями», я не имел в виду, что именно 12 волшебный случай, который нужно проверить специальным условным оператором. Исправляюсь:
    — Представьте, что Вы уже нашли число с $n$ нулями. Но, несмотря на это, будете считать нули в числах, которые короче $n$ знаков. Зачем?

    — Функция pow() работает с действительными числами и в аргументах и в возвращаемом результате. Эта функция отлично находит приближенное значение возводя дробное число в дробную степень разложением в ряд с определенной точностью. А Вы работаете с целыми. Логичнее умножать 1 на 10 при подсчёте нулей.

    Обязательно доведите до ума именно свое решение. На всякий случай приведу мой вариант. Но мне в нем не нравится, что я дважды умножаю на 10.

  4. В строках 8-10 вы вычисляете число с $k$ нулями каждый раз для каждого числа прочитанного с клавиатуры, где $k$ число нулей в предыдущем числе. Возможно, это нужно делать только для чисел с наибольшим числом нулей $maxk$, из ранее прочитанных, и вычислять не каждый раз, а только там где меняется $maxk$.

Добавить комментарий