Skip to content

nesioIV/Pow2SumNum

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 

Repository files navigation

Pow2SumNum

Решение задачи программирования на тему "Минимальная степень 2, равная или больше суммы элементов массива" на языке Java

ФОРМУЛИРОВКА ЗАДАЧИ:

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

ПРОГРАММНЫЙ КОД:

Исходный программный код содержится в файле src\Pow2SumNum.java.

НАЗНАЧЕНИЕ:

Класс Pow2SumNum реализует:

  • метод CalcPow2SumNum, который управляет расчетом наименьшей степени 2, равной или большей суммы чисел в заданном массиве;
  • метод целочисленного двоичного логарифмирования getLog2Log с использованием логарифмов из класса Math и поразрядного умножения (побитового "И");
  • метод getLog2Log целочисленного двоичного логарифмирования с использованием поразрядого сдвига влево;
  • метод возведения 2 в целую положительную степень;
  • метод main, обеспечивающий консольный интерфейс взаимодействия с пользователем.

АЛГОРИТМ:

Вычисляется сумма (Sum) значений заданного массива. Затем вычисляется двумя способами такой целочисленный двоичный логарифм (Log2(Sum)) этой суммы, что 2^(Log2(Sum)) >= Sum.
1-й способ:
Сначала для проверки суммы на степень 2 используется поразрядное умножение (побитовое "И") вида Sum"И"(Sum-1), результат которого должен быть равным 0. Если проверка не удовлетворительна, то далее для двоичного логарифмирования в этом способе используется стандартный метод вычисления натурального логарифма Ln из библиотеки Math и выполняется переход к основанию 2 логарифма по формуле Log2(Sum) = Ln(Sum) / Ln(2).
2-й способ:
В этом способе для двоичного логарифимирования используются битовые операци поразрядого сдвига 1 влево, пока результат сдвига меньше Sum. Искомый логарифм равен величине (к - 1), где к - количество сдвигов. При этом следует контролировать условие, когда сдвигаемая 1 достигнет старшего битового разряда MSB (most significant bit) того целочисленного типа данных, в котором хранится данная сдвигаемая 1 (например, integer или long), поскольку этот разряд предназначен для хранения знака целого числа. В этом граничном случае следует остановить вычисления и принять, что Log2(Sum) = MSB.
Результат:
Искомая минимальная степень 2 вычисляется возведением в степень, которая равна значению целочисленного двоичного логарифма, найденного способами 1 и 2.
Примечание:
Алгоритмы целочисленного двоичного логарифмирования способом 1 и способом 2 при необходимости легко трансформируются в алгоритмы вычисления искомой степени 2 без обособления функциональности двоичного логарифмирования в отдельные методы.

СЛОЖНОСТЬ:

В приложении реализован алгоритм с линейной временной сложностью O(n), определяемой размером n входного массива данных.

РЕАЛИЗАЦИЯ:

Java version "11.0.1", использованы стандартные возможности JDK.

ОГРАНИЧЕНИЯ:

Приложение допускает ввод и обработку только целых положительных чисел типа Integer, которые могут быть заданы во входном массиве.

ТЕСТИРОВАНИЕ:

Тестирование корректности получаемых результатов работы приложения обеспечивается двумя разными способами их расчета.

КОНТРОЛЬНЫЙ ПРИМЕР выполнения приложения:

<Минимальная степень 2, равная или больше суммы элементов массива> NesioIV, 2022

Текущее состояние массива: [ ]
Добавить элемент массива (1 - да / 0 - нет)? 1
Введите элемент массива (целое число 0 < A <= 2147483647): 10
Текущее состояние массива: [10]
Добавить элемент массива (1 - да / 0 - нет)? 1
Введите элемент массива (целое число 0 < A <= 2147483647): 20
Текущее состояние массива: [10, 20]
Добавить элемент массива (1 - да / 0 - нет)? 1
Введите элемент массива (целое число 0 < A <= 2147483647): 30
Текущее состояние массива: [10, 20, 30]
Добавить элемент массива (1 - да / 0 - нет)? 0

Текущее состояние массива: [10, 20, 30]
Выполняется расчет минимальной степени 2 для заданного массива...

Сумма элементов массива
60

Степень 2 (с логарифмиров.)
64
Показатель степени 2 (с логарифмиров.)
6

Степень 2 (с поразр. сдвигом)
64
Показатель степени 2 (с поразр. сдвигом)
6

Время выполнения, мс
0

= Выполнение завершено =

Process finished with exit code 0

About

Typical programming task

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages