Как найти модуль элемента массива

Для решения вашей задачи могут подойти два стандартных алгоритма, оба которых объявлены в заголовочном файле <algorithm>. Это алгоритм std::max, который в качестве аргумента принимает объект типа std::initializer_list. Он имеет следующее объявление

template<class T, class Compare> 
constexpr T max(initializer_list<T> t, Compare comp);

Этот алгоритм возвращает максимальное значение.

И второй алгоритм – это алгоритм std::max_element, который в качестве аргументов принимает итераторы и возвращает итератор, указывающий на элемент с максимальным значением согласно заданному условию сравнения элементов.
Этот алгоритм имеет следующее объявление.

template<class ForwardIterator, class Compare> 
ForwardIterator max_element(ForwardIterator first, ForwardIterator last, Compare comp); 

Когда вы хотите найти максимальный элемент или максимальное значение элементов по абсолютной величине, то возникает одна проблема, о которой многие программисты забывают. Дело в том, что для чисел которые имеют представление дополнение до 2, как это имеет место у большинства компиляторов, если применить функцию, например, к объекту типа int, который имеет минимальное отрицательное значение, то функция std::abs вернет отрицательное значение! И естественно это отрицательное значение будет меньше любого положительного значения или нуля, хотя с математической точки зрения абсолютное значение этого минимального отрицательного значения должны быть по крайней мере больше 0.

Рассмотрите следующий простой пример.

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <limits>

int main()
{
    int min = std::numeric_limits<int>::min();
    int max = std::numeric_limits<int>::max();

    std::cout << "min = " << min << std::endl;
    std::cout << "max = " << max << std::endl;
    std::cout << "std::abs( min ) < 0 is "
              << std::boolalpha
              << (std::abs(min) < 0)
              << std::endl;
}

Вывод программы на консоль будет следующим

min = -2147483648
max = 2147483647
std::abs( min ) < 0 is true

Как видите, оказалось, что std::abs( min ) меньше нуля, хотя с математической точки зрения очевидно, что значение -2147483648 по абсолютной величине не только больше 0, но даже и больше максимального значения 2147483647, которое может храниться в объектах типа int. Поэтому для последовательностей с целочисленными значениями применение стандартной функции std::abs может привести к неверном результату.

Как выйти из этого положения? Для целочисленных значений лучше сравнивать два значения, как отрицательные значения. Например, рассмотрим использование алгоритма std::max

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cstdlib>
#include <limits>

int main()
{
    auto max_abs1 = [](int x, int y)
    {
        return std::abs(x) < std::abs(y);
    };

    int maximum = std::max({ std::numeric_limits<int>::min(),
                             std::numeric_limits<int>::max() },
                             max_abs1);

    std::cout << "maximum = " << maximum << std::endl;

    auto max_abs2 = [](int x, int y)
    {
        return (y < 0 ? y : -y) < (x < 0 ? x : -x);
    };

    maximum = std::max({ std::numeric_limits<int>::min(),
        std::numeric_limits<int>::max() },
        max_abs2);

    std::cout << "maximum = " << maximum << std::endl;
}

Вывод этой программы следующий

maximum = 2147483647
maximum = -2147483648

Как видно из вывода, если применять стандартную функцию std::abs, то в качестве максимального значения по абсолютной величине будет значение 2147483647. А если сравнивать числа как отрицательные числа, то максимальным по абсолютной величине будет значение -2147483648

Для наглядности просто замените в программе объявление типа переменной maximum с int на unsigned int

unsigned int maximum = std::max({ std::numeric_limits<int>::min(),
                                 std::numeric_limits<int>::max() },
                                 max_abs1);

И вы для программы получите следующий результат

maximum = 2147483647
maximum = 2147483648

Из вывода видно, что первое значение, полученное после применения стандартной функции std::abs дает неверный результат.

Для чисел с плавающей запятой достаточно применять стандартную функцию std::abs.

Когда последовательность чисел задается не с помощью объекта std::initializer_list, то можно применить алгоритм std::max_element. Например,

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <limits>

int main()
{
    int a[] =
    {
        std::numeric_limits<int>::min(),
        std::numeric_limits<int>::max()
    };

    auto max_abs = [](int x, int y)
    {
        return (y < 0 ? y : -y) < (x < 0 ? x : -x);
    };

    int *maximum = std::max_element(std::begin( a ), std::end( a ), max_abs);

    std::cout << "maximum = " << ( unsigned int )*maximum << std::endl;
}

Вывод программы на консоль будет, как и предполагалось, следующим

maximum = 2147483648

Номер минимального по модулю элемента массива

Просмотров 5.6к. Обновлено 26 октября 2021

Если стоит задача найти минимальный (или максимальный) элемент по модулю, то значит при поиске нужно сравнивать не сами элементы массива, а их абсолютные значения (модули). Большинство языков программирования имеют встроенную функцию (например, abs()), которая возвращают модуль числа.

Поскольку требуется найти номер минимального по модулю элемента, а не сам элемент (его значение), то при поиске необходимо сохранять индекс найденного на данный момент элемента.

Алгоритм поиска индекса минимального по модулю элемента массива следующий:

  1. Вводим переменную (например, num) и присваиваем ей индекс первого элемента массива (0 или 1 в зависимости от особенностей языка программирования). Тем самым предполагаем, что первый элемент массива и является минимальным по модулю.
  2. Начинаем в цикле перебор массива со второго элемента и до конца. При этом в теле цикла в заголовке условного оператора (if) сравниваем модуль текущего элемента с модулем элемента, чей индекс хранится в переменной num.
  3. Если абсолютное значение текущего элемента массива меньше, чем элемента с индексом num, то в теле условного оператора присваиваем num индекс текущего элемента.
  4. После того, как цикл закончит свою работу, num будет содержать индекс минимального по модулю элемента. Выводим его на экран как есть или увеличиваем на единицу (номер элемента равен индексу при индексации массива с единицы, и на 1 больше индекса при индексации с нуля).

Данное решение задачи не совсем верное, так как находит только первый минимальный элемент. Однако в массиве их может быть несколько (равных между собой или равных между собой только по модулю). Например, в массе [1, 12, 4, 1, 5, 8, 3] минимальных два элемента: первый и четвертый.

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

  1. Сначала ищется и сохраняется в переменной абсолютное значение минимального по модулю элемента (именно значение, а не индекс).
  2. В следующем цикле каждый элемент (его модуль) сравнивается с ранее найденным минимальным и при совпадении номер текущего элемента выводится на экран.

Ниже в примерах решения задачи на языках программирования реализован первый упрощенный алгоритм (находится только первый минимальный по модулю элемент). Здесь приведем вариант решение задачи по второму алгоритму на языке Pascal:

Pascal


const N = 10;
var
arr: array[1..N] of integer;
i, num: byte;
begin
randomize;
for i:=1 to N do begin
arr[i] := random(100)-50;
write(arr[i]:4);
end;
writeln;

num := 1;
for i:=2 to N do
if abs(arr[i]) < abs(arr[num]) then
num := i;

writeln(num);
end.



36 31 -46 -22 -29 -14 26 -41 15 29
6

Язык Си


#include < stdio.h>
#define N 10
main() {
int arr[N];
char i,num;
srand(time(NULL));
for (i=0; i< N; i++) {
arr[i] = rand()%100 - 50;
printf("%d ", arr[i]);
}
printf("n");

num = 0;
for (i=1; i < N; i++) {
if (abs(arr[i]) < abs(arr[num]))
num = i;
}

printf("%dn", num+1);
}



-38 32 39 35 -48 32 -31 -2 -24 -33
7

Python


from random import random
N = 10
arr = []
for i in range(N):
arr.append(int(random() * 100) - 50)
print(arr)

num = 0
for i in range(1, N):
if abs(arr[i]) < abs(arr[num]):
num = i
print(num+1)



[16, -27, 45, -39, 30, -19, 13, 4, 28, -37]
8

КуМир


алг минимальный по модулю
нач
цел N = 10
цел таб arr[1:N]
цел i,num
нц для i от 1 до N
arr[i] := irand(-50,50)
вывод arr[i]:4
кц
вывод нс

num := 1
нц для i от 2 до N
если abs(arr[i]) < abs(arr[num]) то
num := i
все
кц
вывод num, нс
кон



-6 -48 -33 20 -30 -24 -5 -33 28 -18
7

Basic-256


N = 10
dim arr(N)
for i=0 to N-1
arr[i] = int(rand*100) - 50
print arr[i] + " ";
next i
print

num = 0
for i=1 to N-1
if abs(arr[i]) < abs(arr[num]) then
num = i
endif
next i
print num+1



7 -11 -23 27 38 30 17 -41 45 42
1

Найти номер минимального по модулю элемента массива. Например, в массиве [20, -3, -5, 2, 5] минимальным по модулю элементом является число 2. По индексу число 2 – третье, тк отсчёт с нуля.

Что такое модуль числа

Если очень грубо объяснять, то минусы отбрасываются. Например, |-4| = 4, модуль числа минус четыре, равен четырём.

Почти у всех языков программирования есть встроенная функция, которая возвращает модуль числа. Так как нужно найти номер (индекс) элемента с минимальным по модулю, а не сам элемент (его значение), то при поиске необходимо сохранять индекс найденного элемента.

Алгоритм поиска индекса минимального по модулю элемента массива

1) Вводим какую-то переменную и присваиваем ей индекс первого элемента массива 0, предполагая, что первый элемент массива и является минимальным по модулю.

2) Начинаем в цикле перебор массива со второго элемента и до конца. При этом в цикле в заголовке условного оператора (if) сравниваем модуль текущего элемента с модулем элемента, чей индекс хранится в переменной первой переменной.

3) Если абсолютное значение текущего элемента массива меньше, чем элемента с индексом, которое записано в нашу переменную, то в теле условного оператора присваиваем новый индекс текущего элемента.

Поиск минимального модуля числа в массиве

Полезные ссылки :

Ставьте лайки, рассказывайте друзьям и обязательно комментируйте! =)

1,0 K

Комментировать пост…Комментировать…

Николай Веселуха

Высший разум

(334030)


11 лет назад

// _69761031
#include <iostream>
using namespace std;

int main()
{
int a[] = {-3, 2, -8, 2, 0, -4, 4, -6, -5, 7, 9, -1};
int min = a[0], summa = 0;
for (int n = 0; n < sizeof(a) / sizeof(int); n++)
{
if (min > a[n]) min = a[n];
summa += abs(a[n]);
}
cout << “n Minimum = ” << min << “n Summa = ” << summa;
cin.get();
return 0;
}

ra

Высший разум

(113218)


11 лет назад

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main() {
int a[10], c, min, sum = 0;
printf(“random array:”);
srand(time(NULL));
/* инициализация массива случайными числами */
for (c = 0; c < 10; ++c) {
printf(” %d”, a[c] = rand() % 101 – 50);
}
/* поиск минимума */
min = a[0];
for (c = 1; c < 10; ++c) {
if (min > a[c]) {
min = a[c];
}
}
/* подсчет суммы модулей */
printf(“nmin: %d”, min);
for (c = 0; c < 10; ++c) {
sum += a[c] < 0 ? -a[c] : a[c];
}
printf(“nsum: %dn”, sum);
return 0;
}

Формулировка задачи:

Ввести одномерный массив

А

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

#include <iostream.h>
int main()
{
    int n,i;
    // Ввод массива
    cout<<"nVvod n";
    cin>>n;
    int a[n];
    for (i=0; i<n; i++)
    {
        cout<<"na["<<i<<"]=";
        cin>>a[i];
    }
    // Вывод массива
    cout<<"nMassiv a:";
    for (i=0; i<n; i++)
        cout<<"t"<<a[i];

Код к задаче: «Найти максимальный и минимальный по модулю элементы массива»

textual

max=min=abs(a[0]);
for (i=1; i<n; i++)
{
   if(max<abs(a[i]))
      max=abs(a[i]);
   if(min>abs(a[i]))
      min=abs(a[i]);
}

Полезно ли:

11   голосов , оценка 3.909 из 5

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