Задача взята с сайта e-olymp
Задача
Задана послідовність дійсних чисел. Обчислимо їх модулі. Знайдіть максимальне значення серед цих модулей.
Вхідні дані
У першому рядку задано кількість елементів $n\left(n \leqslant 100 \right)$ у послідовності. У наступному рядку задано $n$ дійсних чисел — елементи послідовності, значення яких не первищують за модулем 100.
Вихідні дані
Виведіть максимальне значення серед цих модулей з 2 десятковими знаками.
Тести
# | ВХОДНЫЕ ДАННЫЕ | ВЫХОДНЫЕ ДАННЫЕ |
---|---|---|
1 | 0 -1 1 | 1.00 |
2 | 3 -1.1 1.2 -1.3 |
1.30 |
3 | 5 5.16 0 -7.18 3 4.99 |
7.18 |
4 | 4 -75.111 7.5 -5.1 75.110 |
75.11 |
5 | 10 -1 -2 -3 -4 -5 -6 -7 -8 -9 1 |
9.00 |
Решение
Задача сходиться до пошуку максимального елемента послідовності. Зрозуміло, що найменше можливе значення модуля числа — 0. Тому, считуючи дані зі вхідного потоку будемо порівнювати їх зі змінною, що дорівнює 0. Якщо значення модуля числа більше за змінну — надаємо змінній значення модуля числа. Таким чином після завершення вхідного потоку змінна буде дорівнювати найбільшому числу послідовності за модулем.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <iostream> #include <iomanip> #include <cmath> using namespace std; int main() { int n; cin >> n; double max = 0; for(int i = 0;i < n;i++){ double a; cin >> a; if(abs(a) > max)max = abs(a); } cout<< fixed << setprecision(2) << max; } |
Зачем инициализировать a n раз в цикле, если это можно сделать единожды за его пределами?
Ініціалізування в циклі, без сумніву, краще, оскільки після цього тимчасова змінна видаляється.
«Ініціалізування в циклі, без сумніву, краще, оскільки після цього тимчасова змінна видаляється» а в чем именно преимущество выделения и удаления переменной n раз? Можете развить эту мысль подробнее?
Вчера, проверив оба решения на e-olymp, я увидел, что решение с выделением в цикле работает даже чуть-чуть лучше, чем вне его(надеюсь, что я не перепутал ссылки, т.к. даже я почему-то свой код не вижу).Исходя из этого, мне показалось, что инициализация в цикле не играет существенной роли, однако с точки зрения большого кода,во избежание ошибок, я думаю, лучше иметь пустую переменную. Хотя, есть уже сомнения в том, что я прав:).
Один код работал от 1,95 ms до 2,05 ms. Второй от 1,93 ms до 2,07 ms. Никто не лучше. Время работы здесь не так просто измерить. Приходится анализировать то, во что компилируется код.
Загалом, можна ще додати if(a < 0)a = fabs(a); замість двух обчислень модуля числа, але так рішення займає більше часу.
Забавно, так вышло, что вы писали свой комментарий одновременно с моим. Интересное решение, но советую попробовать ещё и мой вариант.
Но где явно, мне кажется, нужно было бы создать ещё одну переменную — это для вычисления модуля. По сути, вы дважды вызываете функцию abs: в проверке условным оператором и при приравнивании. Возможно, было бы лучше вызвать функцию один раз, а результат записать в какую-то переменную и дальше работать с переменной. Не критично, конечно, но может несколько ускорить программу.