Перейти к содержанию
Найти максимальный по модулю элемент в массиве с уникальными по модулю значениями
Просмотров 5к. Обновлено 26 октября 2021
Абсолютное значение каждого нового числа перед помещением в массив надо сравнить с абсолютными значениями всех чисел, которые уже были добавлены в массив. Если хотя бы в одном сравнении числа совпадут, то новое число не следует добавлять в массив. Если же совпадений не было, то число добавляется массив по текущему индексу, после чего индекс увеличивается на 1.
Поиск же максимума по модулю отличается от обычного лишь тем, что сравниваются абсолютные значения элементов массива.
Pascal
const N = 15;
var
arr: array[1..N] of integer;
i, j: byte;
m: integer;
flag: boolean;
begin
randomize;
arr[1] := random(40) - 20;
i := 2;
while i <= N do begin
m := random(40) - 20;
flag := true;
for j:=1 to i-1 do
if abs(arr[j]) = abs(m) then begin
flag := false;
break;
end;
if flag = true then begin
arr[i] := m;
i := i + 1;
end;
end;j := 1;
for i:=1 to N do begin
write(arr[i]:4);
if abs(arr[i]) > abs(arr[j]) then
j := i;
end;
writeln;
writeln('Максимальный по модулю ', j, '-й элемент равен ', arr[j]);
end.
-1 6 -17 -2 5 -12 -16 -8 -18 9 7 -4 -13 -19 14
Максимальный по модулю 14-й элемент равен -19
Язык Си
#include
#define N 15
main() {
int arr[N], m;
char i,j,f;
srand(time(NULL));
arr[0] = rand()%40 - 20;
i = 1;
while (i < N) {
m = rand()%40 - 20;
f = 1;
for (j=0; j < i; j++)
if (abs(arr[j]) == abs(m)) {
f = 0;
break;
}
if (f == 1) {
arr[i] = m;
i += 1;
}
}
j = 0;
for (i=0; i < N; i++) {
printf("%d ", arr[i]);
if (abs(arr[i]) > abs(arr[j]))
j = i;
}
printf("n");
printf("Максимальный по модулю %d-й элемент равен %dn", j, arr[j]);
}
-2 17 -15 -11 -19 -5 -4 12 13 -3 0 7 -18 -20 8
Максимальный по модулю 13-й элемент равен -20
Python
from random import random
N = 15
m = int(random() * 40) - 20
arr = [m]
i = 1
while i < N:
m = int(random() * 40) - 20
f = 1
for j in arr:
if abs(j) == abs(m):
f = 0
break
if f == 1:
arr.append(m)
i += 1
print(arr)
j = 0
for i in range(1, 15):
if abs(arr[i]) > abs(arr[j]):
j = i
print('Максимальный по модулю %d-й элемент равен %d' % (j,arr[j]))
[-20, 5, 8, -1, -19, -2, -14, 16, 4, 10, -9, 13, -11, 7, -6]
Максимальный по модулю 0-й элемент равен -20
КуМир
алг максимальный уникальный
нач
цел N = 15
цел таб arr[1:N]
цел i,j,m,f
arr[1] := int(rand(0,40)) - 20
i := 2
нц пока i <= N
m := int(rand(0,40)) - 20
f := 1
нц для j от 1 до i-1
если abs(arr[j]) = abs(m) то
f := 0
выход
все
кц
если f = 1 то
arr[i] := m
i := i + 1
все
кцj := 1;
нц для i от 1 до N
вывод arr[i], " "
если abs(arr[i]) > abs(arr[j]) то
j := i
все
кц
вывод нс, "Максимальные по модулю ", j, "-й элемент равен ", arr[j]
кон
17 14 -18 13 5 10 7 -9 -1 -6 -12 2 4 -3 0
Максимальные по модулю 3-й элемент равен -18
Basic-256
N = 15
dim arr(N)
arr[0] = int(rand*40) - 20
i = 1
while i < N
m = int(rand*40) - 20
f = 1
for j=0 to i-1
if abs(arr[j]) = abs(m) then
f = 0
endif
next j
if f = 1 then
arr[i] = m
i = i + 1
endif
endwhile
j = 0
for i=0 to N-1
print arr[i] + " ";
if abs(arr[i]) > abs(arr[j]) then
j = i
endif
next i
print "Максимальный по модулю " + j + "-й элемент равен " + arr[j]
-17 15 -1 -4 16 12 -3 11 -9 -14 -6 0 -19 -8 10
Максимальный по модулю 12-й элемент равен -19
0 / 0 / 0 Регистрация: 07.11.2011 Сообщений: 8 |
|
1 |
|
Вычислить максимальный по модулю элемент массива07.11.2011, 18:44. Показов 5516. Ответов 19
Заполнить случайными числами от -5 до 5. Преобразовать массив так чтобы все элементы равные 0 распологались после всех остальных под буквой а, более или менее получилось сделать, но вот остальные два даже в голову не приходит, как должна выглядеть программа.
0 |
4726 / 2547 / 757 Регистрация: 18.08.2009 Сообщений: 4,568 |
|
07.11.2011, 19:44 |
2 |
под буквой а, более или менее получилось сделать, но вот остальные два даже в голову не приходит, как должна выглядеть программа. ну Вы покажите что получилось под буквой а, остальное Вам может быть помогут.
0 |
0 / 0 / 0 Регистрация: 07.11.2011 Сообщений: 8 |
|
07.11.2011, 19:49 [ТС] |
3 |
ну на экране появлялся массив и ниже строка «nomer elementa = (и тут было число максимального по модулю элемента массива)»
0 |
LostCoast 82 / 82 / 24 Регистрация: 30.09.2011 Сообщений: 404 Записей в блоге: 6 |
||||
07.11.2011, 19:51 |
4 |
|||
б)сумму элементов массива расположенных между первым и вторым положительными элементами.
вроде работает.Не проверял все случаи, при каком-то не вычислилась сумма, хотя может глюк.
1 |
4726 / 2547 / 757 Регистрация: 18.08.2009 Сообщений: 4,568 |
|
07.11.2011, 19:51 |
5 |
dlinniy_miron, а код покажете?
0 |
DenCHS200 32 / 32 / 8 Регистрация: 07.10.2011 Сообщений: 117 |
||||||||
07.11.2011, 20:09 |
6 |
|||||||
Сообщение было отмечено Памирыч как решение РешениеТакая прога сойдёт?
Добавлено через 14 минут
0 |
0 / 0 / 0 Регистрация: 07.11.2011 Сообщений: 8 |
|
07.11.2011, 20:11 [ТС] |
7 |
Такая прога сойдёт? парочка вопросов, если можно)) Добавлено через 1 минуту
dlinniy_miron, а код покажете? код к сожалению на другом компьютере
0 |
82 / 82 / 24 Регистрация: 30.09.2011 Сообщений: 404 Записей в блоге: 6 |
|
07.11.2011, 20:16 |
8 |
dlinniy_miron, тогда обрати на мой пример внимание, он попроще.
0 |
DenCHS200 32 / 32 / 8 Регистрация: 07.10.2011 Сообщений: 117 |
||||
07.11.2011, 20:20 |
9 |
|||
1) вместо int _tmain(int argc, _TCHAR* argv[]) можешь просто написать int main(), это С++ у меня по-умолчанию пишет, можно стереть 2)а first=7 и second=7 это я написал, чтобы когда мы проверяли , ввели ли мы другие номера массива в эти переменные, вот только 7 испрвавь на числа больше 9 или меньше 0, эот моя ошибка(Просто такие числа (меньше 0 или больше 9)не будут присвоены из цикла do{} while, так как у нас массив из 10 элементов от 0 до 9, а если число в диапазоне от 0 до 9 будет переменным first и second присвоено, то значит в цикле было найдено положительное число) Добавлено через 4 минуты
1 |
0 / 0 / 0 Регистрация: 07.11.2011 Сообщений: 8 |
|
07.11.2011, 20:23 [ТС] |
10 |
dlinniy_miron, тогда обрати на мой пример внимание, он попроще. я заметил что попроще, но интересно count = 0; зачем? Ведь в дальнейшем ты не используешь вроде нигде. Извиняюсь за свои вопросы, просто программируем в досовском си)
0 |
82 / 82 / 24 Регистрация: 30.09.2011 Сообщений: 404 Записей в блоге: 6 |
|
07.11.2011, 20:25 |
11 |
но интересно count = 0; зачем? сорри))) остался с прошлого варианта, можешь удалить)
0 |
0 / 0 / 0 Регистрация: 07.11.2011 Сообщений: 8 |
|
07.11.2011, 20:27 [ТС] |
12 |
1) вместо int _tmain(int argc, _TCHAR* argv[]) можешь просто написать int main(), это С++ у меня по-умолчанию пишет, можно стереть 2)а first=7 и second=7 это я написал, чтобы когда мы проверяли , ввели ли мы другие номера массива в эти переменные, вот только 7 испрвавь на числа больше 9 или меньше 0, эот моя ошибка(Просто такие числа (меньше 0 или больше 9)не будут присвоены из цикла do{} while, так как у нас массив из 10 элементов от 0 до 9, а если число в диапазоне от 0 до 9 будет переменным first и second присвоено, то значит в цикле было найдено положительное число) спасибо за помощь и за объяснение каждого пункта, под досовский я думаю легко отредактировать, так что сейчас попробую) Добавлено через 1 минуту
сорри))) остался с прошлого варианта, можешь удалить) хорошо=))
0 |
32 / 32 / 8 Регистрация: 07.10.2011 Сообщений: 117 |
|
07.11.2011, 20:31 |
13 |
Просто сохранить весь этот листинг в срр файл и в ДОсовском С++ запустить можно, чтоб не маяться
0 |
0 / 0 / 0 Регистрация: 07.11.2011 Сообщений: 8 |
|
07.11.2011, 20:32 [ТС] |
14 |
Просто сохранить весь этот листинг в срр файл и в ДОсовском С++ запустить можно, чтоб не маяться и что запустится? Мне кажется ошибку выдаст наверно
0 |
32 / 32 / 8 Регистрация: 07.10.2011 Сообщений: 117 |
|
07.11.2011, 20:43 |
15 |
Если синтаксис такой же, то не должен
0 |
0 / 0 / 0 Регистрация: 07.11.2011 Сообщений: 8 |
|
07.11.2011, 20:48 [ТС] |
16 |
Если синтаксис такой же, то не должен понятно)Спасибо)
0 |
Nursik77 В вечном поиске… 275 / 235 / 30 Регистрация: 05.04.2011 Сообщений: 645 |
||||||||
07.11.2011, 21:16 |
17 |
|||||||
Мой вариант:
Ну и другой вариант
в котором массив заполнен ручками, для ясности.
0 |
lemegeton 4431 / 2369 / 854 Регистрация: 29.11.2010 Сообщений: 5,243 |
||||
07.11.2011, 21:25 |
18 |
|||
Сообщение было отмечено Памирыч как решение РешениеSTL:
1 |
0 / 0 / 0 Регистрация: 07.11.2011 Сообщений: 8 |
|
08.11.2011, 04:45 [ТС] |
19 |
если честно, то как то тяжело
0 |
lemegeton 4431 / 2369 / 854 Регистрация: 29.11.2010 Сообщений: 5,243 |
||||
10.11.2011, 02:06 |
20 |
|||
Сообщение было отмечено Памирыч как решение РешениеТак легче?
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
10.11.2011, 02:06 |
20 |
Для решения вашей задачи могут подойти два стандартных алгоритма, оба которых объявлены в заголовочном файле <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
Формулировка задачи:
Ввести одномерный массив
А
, вывести его. Найти максимальный и минимальный по модулю элементы массива. Если модуль максимального элемента превышает значение модуля минимального более чем на 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
uses crt; const nmax = 100; type mas = array [1 .. nmax] of real; function Max(m: mas; n: byte): real; var i: byte; mx: real; begin mx := m[1]; for i := 1 to n do if abs(m[i]) > abs(mx) then mx := m[i]; Max := mx; end; var a: mas; n, i: byte; begin clrscr; randomize; repeat write('Размер массива до ', nmax, ' n='); readln(n); until n in [1 .. nmax]; writeln('Исходный массив:'); for i := 1 to n do begin a[i] := 20 * random - 10; write(a[i]:0:2, ' '); end; writeln; writeln; write('Максимальный по модулю элемент=', Max(a, n):0:2); readln end.