e-olymp 931. Отношение произведения к сумме

Задача

Вычислить отношение произведения цифр натурального числа к их сумме.

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

Натуральное число [latex]n[/latex], не превышающее 2·109.

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

Вывести отношение произведения цифр числа [latex]n[/latex] к их сумме с 3 десятичными цифрами.

Решение

Для решения поставленной задачи нам нужно выделить отдельные цифры в записи данного числа, чтобы сосчитать их произведение и сумму. Для этого прочитаем это число из входного потока данных и реализуем разбиение числа на цифры с помощью цикла while.  Благодаря остатку от деления числа на 10 получаем последнюю цифру текущего числа, затем делим это число на 10. Если полученное число не 0, повторяем все действия, постепенно накапливая произведение и сумму. Найденные значения произведения и суммы цифр данного числа разделим, предварительно воспользовавшись явным преобразованием к типу double. Это и будет ответом, но так как в задаче указано вывести ответ с тремя десятичными цифрами, я использовала функцию <code>setprecision(3)</code>. В итоге получаем решение этой задачи.

Код

 

Тесты

Входные данные Выходные данные
36 2.000
3456 20.000
1645 7.500

Задача взята отсюда.

Код программы на Ideone.com.

Алина Гончарова
Алина Гончарова

Latest posts by Алина Гончарова (see all)

9 thoughts on “e-olymp 931. Отношение произведения к сумме

  1. — А куда делось название задачи?
    — Где ключевые слова (tags)?
    — На ideone.com выложена какая-то чушь, которая даже не компилируется.
    — Ваше описание решения задачи подходит для всех задач раздела. Как решить задачу на циклы? При помощи цикла! Ура! Теперь всё ясно.
    — Сделайте правильные отступы везде в программе.
    — //cout << "Enter your digit: "; -? - cin.get(); - ? Я бы подумал, что этот черновик выложен на проверку по ошибке, но Вы реально уже 10 дней ждёте, когда я его проверю. Как-то несерьёзно получается. Пока ставлю -5.

  2. Вам абсолютно не за что извиняться. Вы ещё только учитесь. Хотя несерьёзное отношение к делу приводит к негативным оценкам.

    — Поправьте отступы в приведенном коде программы.
    — Снова прошу — сделайте полноценное описание алгоритма решения задачи. У Вас 6 строк программы реализуют основной цикл. Всё, что Вы пишите о вычислении это то, что там есть while (зачем-то в latex, как математическую формулу). Вам нужно описать как вычисляется очередная цифра числа и что Вы с ней делаете. Уверен, что подробно это описав Вы и сами увидите, что используете совершенно не влияющие на работу программы списки. Список не только не имеет отношения к теме задания (простые циклы, потоковая обработка), но и не оказывает абсолютно никакого влияния на результат.
    Действительно работа стала лучше.

    Поскольку замечания идут повторно, думаю справедливо будет добавить еще -1 балл.

  3. — Вы пишите «Так как задано число не превышающее 2·109, я использовала тип данных long double.» По этому поводу у меня несколько замечаний. Во-первых, никакого long double в вашей программе нет. Во-вторых, 32-х бит достаточно для хранения чисел в диапазоне от -2.147.483.648 до +2.147.483.647. Т.е. его вполне достаточно для условий задачи.
    — «Остатком от деления числа на 10 я получила все цифры данного числа по отдельности.» — остаток от деления на 10 поможет Вам вычислить только последнюю цифру.
    — «После все эти цифры с помощью арифметической операции * перемножила все полученные цифры, затем с помощью арифметической операции + суммировала цифры.» — разбейте текст на отдельные предложения и уберите повторы.
    — Сделайте правильные отступы. Даже в этой строке «summ+=digit;».
    — Зачем Вы кладёте в result 0.0 и тут же меняете это значение на tmp/summ. И зачем вообще нужна эта переменная? Напечатать tmp/summ без неё Вы не можете?

  4. Стало лучше. Молодец.
    Но ещё не всё хорошо.
    — Вы пишите «число разделить на отдельные цифры». Нам не нужно делить число. Возможно вы хотели сказать «выделить отдельные цифры в записи числа»? Можно ещё сказать «разбить запись числа на цифры». Или даже просто — «разбить число на цифры».
    — Вы пишите «Для этого считаем данное число». Опять двусмысленность. Лучше написать «прочтём из входного потока».
    — «Запускаем цикл» это пустая фраза. Дальше всё хорошо объясняется.
    — Про setprecision(3) лучше написать с помощью тега <code>setprecision(3)</code>. Тогда не будет выделяться отдельная строка и всё будет выглядеть как Вы и задумали — setprecision(3). Можно это было сделать и в диалоговом окне редактора если поставить галочку в поле «inline».
    — Для суммы Вы хорошо выбрали имя переменной. А для произведения tmp это не имя. В конце-концов, как говорится в книге Екклезиаста гл.1 ст.9-10 — всё на свете tmp.

  5. Хорошо, Алина, я зачёл.

    Кстати, помните, мы на практике рассматривали задачу «C++ vs Java» про именование переменных. Вы придумали хорошие названия и правильно их назвали. Но так multOfDigits обычно называют на Java. На C++ чаще пишут mult_of_digits.

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