Помогите пожалуйста!Найти максимум из отрицательных элементов?Паскаль.
Профи
(857),
на голосовании
12 лет назад
Голосование за лучший ответ
Дмитрий
Гуру
(4681)
12 лет назад
Очень просто. Если эти элементы в массиве, то
var a:array [1..100] of integer;
i,max:integer;
begin
randomize;
max:=-100;
for i:=1 to 100 do begin //здесь можешь уменьшить кол-во элементов
a[ i ]:=-100+random(200);
write(a[ i ],’ ‘);end;
writeln;
for i:=1 to 100 do
if a[ i ]<0 then
if a[ i ]>max then max:=a[ i ];
writeln(‘Макс отрицательный элемент – ‘,max);
readln;
end.
Improve Article
Save Article
Like Article
Improve Article
Save Article
Like Article
Given a sorted array arr[] consisting of N integers, the task is to find the maximum among the count of positive or negative integers in the array arr[].
Examples:
Input: arr[] = {-9, -7, -4, 1, 5, 8, 9}
Output: 4
Explanation:
The count of positive numbers is 4 and the count of negative numbers is 3. So, the maximum among 4, 3 is 4. Therefore, print 4.Input: arr[] = {-8, -6, 10, 15}
Output: 2
Naive approach:
This approach to solve the problem is to count the occurrences of positive and negative numbers by traversing the array once. Finally, return the maximum of the counts of positives and negatives.
Algorithm:
- Initialize variables cntpositive and cntnegative as 0.
- Traverse the array from 0 to size-1:
a. If the current element arr[i] is greater than 0, increment cntpositive.
b. Else if the current element arr[i] is less than 0, increment cntnegative. - Compute the maximum of cntpositive and cntnegative using the max() function.
- Return the maximum count.
Below is the implementation of the above approach:
C++
#include "bits/stdc++.h"
using
namespace
std;
int
findMaximum(
int
arr[],
int
size) {
int
cntpositive = 0, cntnegative = 0;
for
(
int
i = 0; i < size; i++) {
if
( arr[i] > 0 )
cntpositive++;
else
if
( arr[i] < 0 )
cntnegative++;
}
return
max(cntpositive, cntnegative);
}
int
main()
{
int
arr[] = { -9, -7, -4, 1, 5, 8, 9 };
int
N =
sizeof
(arr) /
sizeof
(arr[0]);
cout << findMaximum(arr, N);
return
0;
}
Time Complexity: O(N) as we are traversing entire array once. Here, N is size of input array.
Auxiliary Space: O(1) as no extra space has been used.
Efficient approach: The given problem can be solved by using Binary Search, the idea is to find the first index whose value is positive and then print the maximum of idx and (N – idx) as the result. Follow the steps below to solve the given problem:
- Initialize two variables, say low as 0 and high as (N – 1).
- Perform the Binary Search on the given array arr[] by iterating until low <= high and follow the below steps:
- Find the value of mid as (low + high) / 2.
- If the value of arr[mid] is positive, then skip the right half by updating the value of high to (mid – 1). Otherwise, skip the left half by updating the value of low to (mid + 1).
- After completing the above steps, print the maximum of low and (N – low) as the result.
Below is the implementation of the above approach:
C++
#include "bits/stdc++.h"
using
namespace
std;
int
findMaximum(
int
arr[],
int
size)
{
int
i = 0, j = size - 1, mid;
while
(i <= j) {
mid = i + (j - i) / 2;
if
(arr[mid] < 0)
i = mid + 1;
else
if
(arr[mid] > 0)
j = mid - 1;
}
return
max(i, size - i);
}
int
main()
{
int
arr[] = { -9, -7, -4, 1, 5, 8, 9 };
int
N =
sizeof
(arr) /
sizeof
(arr[0]);
cout << findMaximum(arr, N);
return
0;
}
Java
import
java.io.*;
public
class
GFG {
static
int
findMaximum(
int
arr[],
int
size)
{
int
i =
0
, j = size -
1
, mid;
while
(i <= j) {
mid = i + (j - i) /
2
;
if
(arr[mid] <
0
)
i = mid +
1
;
else
if
(arr[mid] >
0
)
j = mid -
1
;
}
return
Math.max(i, size - i);
}
public
static
void
main (String[] args)
{
int
arr[] = { -
9
, -
7
, -
4
,
1
,
5
,
8
,
9
};
int
N = arr.length;
System.out.println(findMaximum(arr, N));
}
}
Python3
def
findMaximum(arr, size):
i
=
0
j
=
size
-
1
while
(i <
=
j):
mid
=
i
+
(j
-
i)
/
/
2
if
(arr[mid] <
0
):
i
=
mid
+
1
elif
(arr[mid] >
0
):
j
=
mid
-
1
return
max
(i, size
-
i)
if
__name__
=
=
"__main__"
:
arr
=
[
-
9
,
-
7
,
-
4
,
1
,
5
,
8
,
9
]
N
=
len
(arr)
print
(findMaximum(arr, N))
C#
using
System;
public
class
GFG
{
static
int
findMaximum(
int
[]arr,
int
size)
{
int
i = 0, j = size - 1, mid;
while
(i <= j) {
mid = i + (j - i) / 2;
if
(arr[mid] < 0)
i = mid + 1;
else
if
(arr[mid] > 0)
j = mid - 1;
}
return
Math.Max(i, size - i);
}
public
static
void
Main (
string
[] args)
{
int
[]arr = { -9, -7, -4, 1, 5, 8, 9 };
int
N = arr.Length;
Console.WriteLine(findMaximum(arr, N));
}
}
Javascript
<script>
function
findMaximum(arr, size)
{
let i = 0,
j = size - 1,
mid;
while
(i <= j)
{
mid = i + Math.floor((j - i) / 2);
if
(arr[mid] < 0) i = mid + 1;
else
if
(arr[mid] > 0) j = mid - 1;
}
return
Math.max(i, size - i);
}
let arr = [-9, -7, -4, 1, 5, 8, 9];
let N = arr.length;
document.write(findMaximum(arr, N));
</script>
Time Complexity: O(log N)
Auxiliary Space: O(1)
Last Updated :
18 May, 2023
Like Article
Save Article
Раздел:
Задачи /
Простейшие /
Найти максимальное отрицательное число
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее… |
Условие задачи 1.9
Задача 1.9
Даны три целых числа А, В, С. Вывести на экран максимальное отрицательное число.
Именно так звучит условие этой задачи. И, честно говоря, для меня оно не является однозначным.
Что такое максимальное отрицательное число? Это отрицательное число с наименьшим значением? Или всё-таки это отрицательное число, которое имеет наибольшее значение среди остальных?
Например,
-4, -3, -1
Какое число здесь является максимальным отрицательным? -4 или -1?
Вот ведь, загадили русский язык иностранными словами, а теперь сами не можем понять, о чём говорим)))
Если было сказано – “наибольшее отрицательное число”, то всё было бы понятно. В примере наибольшим является -1.
А максимальное – это с какого конца оси на множестве целых чисел? Вот ведь вопрос…
Если попытаться вспомнить строгие математические термины, то тут будет без бутылки не разобраться, потому что придётся вспоминать всё.
Ну да ладно, приняв во внимание, что на русский язык слово “максимальный” переводится как наибольший, а также вспомнив таки немного математику и учтя, что в случае линейно упорядоченного множества (коим и являются наши числа) максимальный элемент является наибольшим, а минимальный – наименьшим, будем считать, что в нашем примере максимальным отрицательным числом будет -1. Из этого и будем исходить при решении задачи.
Однако, надо обратить внимание также на то, что числа А, В, С могут быть положительными (причём как все, так и некоторые из них).
Вариантов решения, как всегда, немало. Можно, например, сохранить эти числа в
массив и отсортировать его по убыванию. А затем перебрать его элементы до тех пор, пока не попадётся первое отрицательное число. Оно и будет максимальным отрицательным. Если же такого не найдётся, значит отрицательных чисел среди А, В, С не было.
Можно попробовать решить задачу рекурсивно (правда, я не пробовал и даже не думал, может и нельзя)))).
Но мы пойдём другим путём…
Вообще, задачка не такая уж и простая. Начинающему программисту придётся поломать голову (но это и хорошо – только так из начинающих программистов получаются опытные – путём ломания голов))).
Возможно, я нашёл не самые лучшие решения. Но по крайней мере они работают. Вот решения на
Паскале и
С++.
Решение задачи 1.9 на Паскале
program maxneg; //**************************************************************** // КОНСТАНТЫ //**************************************************************** const MAX_VAL = 1000; //**************************************************************** // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ //**************************************************************** var A, B, C : Integer; Nums : byte; //**************************************************************** // ФУНКЦИИ И ПРОЦЕДУРЫ //**************************************************************** //**************************************************************** // Возвращает случайное значение //**************************************************************** function GetRandomNum : Integer; begin Result := Random(MAX_VAL) - ((MAX_VAL div 10) * 7); end; //**************************************************************** // Сравнивает два числа // ВХОД: N1, N2 - числа для сравнения // ВЫХОД: 0 - числа равны // 1 - число 1 больше числа 2 // 2 - число 2 больше числа 1 //**************************************************************** function GetMax(N1, N2 : integer) : integer; begin Result := 0; if (N1 > N2) then Result := 1 else if (N1 < N2) then Result := 2; end; //**************************************************************** // Сравнивает три отрицательных числа // ВХОД: N1, N2, N3 - числа для сравнения // ВЫХОД: 'A' - наибольшее число N1 // 'B' - наибольшее число N2 // 'C' - наибольшее число N3 //**************************************************************** function GetMaxABC(N1, N2, N3 : integer) : char; begin Result := 'C'; if GetMax(N1, N2) < 2 then //Если N1 >= N2 begin if GetMax(N1, N3) < 2 then //Если N1 >= N3 Result := 'A'; end else //Если N1 < N2 begin if GetMax(N2, N3) < 2 then //Если N2 >= N3 Result := 'B'; end; end; //**************************************************************** // Определяет знаки чисел и возвращает их в разрядах числа типа BYTE // ВХОД: na, nb, nc - числа A, B, C // ВЫХОД: знаки чисел - бит 2 - число na, бит 1 - число nb, бит 0 - число nc // То есть всего возможны 8 комбинаций: // 0 - все положительные // 1 - С < 0 // 2 - B < 0 // 3 - B и С меньше нуля // 4 - A < 0 // 5 - A и С меньше нуля // 6 - A и B меньше нуля // 7 - все отрицательные //**************************************************************** function GetNumZnak(na, nb, nc : integer) : byte; var ba, bb, bc : byte; begin ba := 0; bb := 0; bc := 0; if na < 0 then ba := 4; if nb < 0 then bb := 2; if nc < 0 then bc := 1; Result := ba + bb + bc; end; //**************************************************************** // Выводит результат на экран // ВХОД: S - имя числа, N - значение числа // ВЫХОД: Если N >= 0, то сообщение об отсутствии отрицательных чисел // Если N < 0, то имя числа и его значение (число N) //**************************************************************** procedure NumberToScreen(S : char; N : integer); begin if N < 0 then WriteLn('The smallest negative number is ', S, ' = ', N) else WriteLn('All the numbers are positive'); end; //**************************************************************** // ОСНОВНАЯ ПРОГРАММА // Алгоритм: // получить только отрицательные числа // сравнить эти числа //**************************************************************** begin //Запустить генератор случайных чисел Randomize; //Получить случайные значения для чисел А, В, С A := GetRandomNum; B := GetRandomNum; C := GetRandomNum; WriteLn('A = ', A, ', B = ', B, ', C = ', C); Nums := GetNumZnak(A, B, C); case Nums of 0 : //Все числа положительные NumberToScreen('A', A); 1 : //Только С < 0; NumberToScreen('C', C); 2 : //Только B < 0; NumberToScreen('B', B); 3 : //B и С меньше нуля if GetMax(B, C) < 2 then //Если B = С или B > C, то NumberToScreen('B', B) //искомое число - это B else //иначе NumberToScreen('C', C); //искомое число - это С 4 : //Только A < 0; NumberToScreen('A', A); 5 : //A и С меньше нуля if GetMax(A, C) < 2 then //Если A = С или A > C, то NumberToScreen('A', A) //искомое число - это A else //иначе NumberToScreen('C', C); //искомое число - это С 6 : //A и B меньше нуля if GetMax(A, B) < 2 then //Если A = B или A > B, то NumberToScreen('A', A) //искомое число - это A else //иначе NumberToScreen('B', B); //искомое число - это B 7 : //Все числа отрицательные; case GetMaxABC(A, B, C) of 'A' : NumberToScreen('A', A); 'B' : NumberToScreen('B', B); 'C' : NumberToScreen('C', C); end; end; WriteLn('The end. Press ENTER...'); ReadLn; end.
Решение задачи 1.9 на С++
#include #include using namespace std; //**************************************************************** // КОНСТАНТЫ //**************************************************************** const int MAX_VAL = 1000; //**************************************************************** // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ //**************************************************************** int A, B, C; char Nums; //**************************************************************** // ФУНКЦИИ И ПРОЦЕДУРЫ //**************************************************************** //**************************************************************** // Возвращает случайное значение //**************************************************************** int GetRandomNum() { int n = (MAX_VAL / 10) * 7; return(rand()%MAX_VAL - (int)n); } //**************************************************************** // Сравнивает два числа // ВХОД: N1, N2 - числа для сравнения // ВЫХОД: 0 - числа равны // 1 - число 1 больше числа 2 // 2 - число 2 больше числа 1 //**************************************************************** int GetMax(int N1, int N2) { int Res = 0; if (N1 > N2) Res = 1; else if (N1 < N2) Res = 2; return(Res); } //**************************************************************** // Сравнивает три отрицательных числа // ВХОД: N1, N2, N3 - числа для сравнения // ВЫХОД: 'A' - наибольшее число N1 // 'B' - наибольшее число N2 // 'C' - наибольшее число N3 //**************************************************************** char GetMaxABC(int N1, int N2, int N3) { char Res = 'C'; if (GetMax(N1, N2) < 2) //Если N1 >= N2 { if (GetMax(N1, N3) < 2) //Если N1 >= N3 Res = 'A'; } else //Если N1 < N2 { if (GetMax(N2, N3) < 2) //Если N2 >= N3 Res = 'B'; } return(Res); } //**************************************************************** // Определяет знаки чисел и возвращает их в разрядах числа типа BYTE // ВХОД: na, nb, nc - числа A, B, C // ВЫХОД: знаки чисел - бит 2 - число na, бит 1 - число nb, бит 0 - число nc // То есть всего возможны 8 комбинаций: // 0 - все положительные // 1 - С < 0 // 2 - B < 0 // 3 - B и С меньше нуля // 4 - A < 0 // 5 - A и С меньше нуля // 6 - A и B меньше нуля // 7 - все отрицательные //**************************************************************** char GetNumZnak(int na, int nb, int nc) { int ba = 0; int bb = 0; int bc = 0; if (na < 0) ba = 4; if (nb < 0) bb = 2; if (nc < 0) bc = 1; return(ba + bb + bc); } //**************************************************************** // Выводит результат на экран // ВХОД: S - имя числа, N - значение числа // ВЫХОД: Если N >= 0, то сообщение об отсутствии отрицательных чисел // Если N < 0, то имя числа и его значение (число N) //**************************************************************** void NumberToScreen(char S, int N) { if (N < 0) cout << "The smallest negative number is " << S << " = " << N << endl; else cout << "All the numbers are positive" << endl;; } //**************************************************************** // ОСНОВНАЯ ПРОГРАММА //**************************************************************** int main(int argc, char *argv[]) { //Запустить генератор случайных чисел srand(time(0)); //Получить случайные значения для чисел А, В, С A = GetRandomNum(); B = GetRandomNum(); C = GetRandomNum(); cout << "A = " << A << ", B = " << B << ", C = " << C << endl; Nums = GetNumZnak(A, B, C); switch(Nums) { case 0 : //Все числа положительные NumberToScreen('A', A); break; case 1 : //Только С < 0; NumberToScreen('C', C); break; case 2 : //Только B < 0; NumberToScreen('B', B); break; case 3 : //B и С меньше нуля if (GetMax(B, C) < 2) //Если B = С или B > C, то NumberToScreen('B', B); //искомое число - это B else //иначе NumberToScreen('C', C); //искомое число - это С break; case 4 : //Только A < 0; NumberToScreen('A', A); break; case 5 : //A и С меньше нуля if (GetMax(A, C) < 2) //Если A = С или A > C, то NumberToScreen('A', A); //искомое число - это A else //иначе NumberToScreen('C', C); //искомое число - это С break; case 6 : //A и B меньше нуля if (GetMax(A, B) < 2) //Если A = B или A > B, то NumberToScreen('A', A); //искомое число - это A else //иначе NumberToScreen('B', B); //искомое число - это B break; case 7 : //Все числа отрицательные; switch(GetMaxABC(A, B, C)) { case 'A' : NumberToScreen('A', A); break; case 'B' : NumberToScreen('B', B); break; case 'C' : NumberToScreen('C', C); break; } } system("PAUSE"); return EXIT_SUCCESS; }
|
Как стать программистом 2.0
Эта книга для тех, кто хочет стать программистом. На самом деле хочет, а не просто мечтает. И хочет именно стать программистом с большой буквы, а не просто научиться кулебякать какие-то примитивные программки… |
|
Помощь в технических вопросах
Помощь студентам. Курсовые, дипломы, чертежи (КОМПАС), задачи по программированию: Pascal/Delphi/Lazarus; С/С++; Ассемблер; языки программирования ПЛК; JavaScript; VBScript; Fortran; Python и др. Разработка (доработка) ПО ПЛК (предпочтение – ОВЕН, CoDeSys 2 и 3), а также программирование панелей оператора, программируемых реле и других приборов систем автоматизации. |
Формулировка задачи:
Товарищи программисты, доброго дня!
прошу содействия в решении следующей задачи:
Найти максимальный из отрицательных элементов среди произвольных
20 чисел, вводимых с клавиатуры
мой ход мыслей таков = не учитывать в цикле положительные элементы, а среди отрицательных – найти минимальный по модулю.
если же подобное оговарилось ранее, буду признательна ссылке на соответствующую тему.
Заранее благодарю
Код к задаче: «Найти максимальный из отрицательных элементов среди произвольных 20 чисел»
textual
Sub z() Dim x#, m#, i% For i = 1 To 20 x = InputBox("Введите " & i & "-ое число:") If x < 0 And (x > m Or m = 0) Then m = x Next i If m <> 0 Then MsgBox "максимальное из отрицательных = " & m Else MsgBox "отрицательных чисел нет" End Sub
Полезно ли:
7 голосов , оценка 4.143 из 5
Часто случается, что в одном диапазоне ячеек находятся вместе положительные и отрицательные числа. Необходимо определить экстремальные значения, но с определенными условиями. Следует получить наименьшее значение для положительных чисел и отдельно для отрицательных. Для решения данной задачи не достаточно просто использовать функции =МИН(), =МАКС() или =НАИМЕНЬШИЙ(), =НАИБОЛЬШИЙ(). Иначе при обращении функций к диапазону с перемешанными положительными и отрицательными числами, будет возвращено только отрицательное наименьшее значение. Поэтому следует использовать специальную формулу с функциями.
Наименьшее положительное число
Допустим у нас есть статистика доходов и расходов сети магазинов за месяц. А нам нужно узнать какие из торговых точек наименее затратные по расходам и наименее прибыльны по доходам. Для презентации решения будем использовать пример таблицы с доходами и расходами магазинов как показано на рисунке:
В первую очередь следует найти наименьший доход. Для этого формула должна сначала рассмотреть группу, состоящую только из положительных. После чего найдите наименьшее положительное значение функции. Для этого:
- В ячейке D2 введем следующую формулу:
- После ввода формулы для подтверждения необходимо нажать комбинацию горячих клавиш: CTRL+SHIFT+Enter, так как она должна выполняться в массиве. Если все сделано правильно тогда в строке формул будут видны фигурные скобки.
Разбор принципа действия формулы для поиска наименьшего положительного числа:
Логическая функция =ЕСЛИ(), которая выполняется в массиве формул, проверяет каждую ячейку диапазона C2:C13 какая из них содержит число меньше чем 0 или равно нулю (<=0). Таким образом создается условная таблица в памяти с логическими значениями:
- ЛОЖЬ – для положительных чисел (в данном случаи и для нуля);
- ИСТИНА – для отрицательных чисел.
После чего в условной таблице функция ЕСЛИ заменяет все значения ИСТИНА на пустые (””). А вместо значения ЛОЖЬ подставляются те числа положительные, которые и были раньше в диапазоне C2:C13. И завершает вычисления формулы функция =МИН(), которая из условной таблицы (уже отфильтрованной от отрицательных значений и нулей) возвращает нам наименьшее положительное число.
Наибольшее отрицательное число в диапазоне ячеек
Чтобы найти наименьшие расходы среди отрицательных значений укажите наибольшее. Для этого следует выполнить следующие действия:
- В ячейке E2 введите формулу:
- Так же, как и предыдущей формуле после ввода необходимо нажать комбинацию клавиш: CTRL+SHIFT+Enter, так как она должна выполняться в массиве. Если все сделано правильно в строке формул появятся фигурные скобки.
Скачать формулы для поиска наименьшего положительного и наибольшего отрицательного числа
В результате мы быстро и легко переделили самый слабый магазин по доходам – это №4. А наименее затратная торговая точка по расходам – это магазин №2.