Как найти минимальное положительное число в массиве

So … I have : int array[] = {-8,2,0,5,-3,6,0,9};

I want to find the smallest positive number ( which in the list above is 2 )

This is what i am doing :


int array[] = {-8,2,0,5,-3,6,0,9};

int smallest=0;


        for(int i=0;i<array.length;i++) // Find the first number in array>0 (as initial           
                                         // value for int smallest)
        {
            if(array[i]>0)
            {
                smallest=array[i]; 
                break;// Break out of loop, when you find the first number >0
            }   
        }


        for(int i=0;i<array.length;i++) // Loop to find the smallest number in array[]
        {

            if(smallest>array[i]&&array[i]>0)
            {
                smallest=array[i];

            }

        }

        System.out.println(smallest);

        }

My question is :

Can we reduce the number of steps ?
Is there any smarter/shorter way of doing it, with no other data structure.

Thanks.

Artem_Santos

0 / 0 / 0

Регистрация: 26.12.2017

Сообщений: 6

1

Найти минимум положительных элементов массива

26.12.2017, 19:11. Показов 3674. Ответов 14

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Условие:
В ведённом массиве действительных чисел найти и вывести минимум положительных элементов массива. Увеличить все элементы массива на найденный минимум или на введенное пользователем число в случае отсутствия положительных элементов. Вывести обновленный массив.
Программа работает не правильно, код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
    setlocale(LC_CTYPE , "rus");
    int A[4];
    for(int i=0; i < 4; i++)
    {
        cout << "A[" << i << "]=";
        cin >> A[i];         
    }
    int min = A[0];
    for(int i=0; i < 4; i++)
     {
      if(A[i]>0 && A[i]<min)
       min = A[i];
     }
     int p,m;
        if(min >= 1){
        for(int i=0; i < 1; i++){
       min = A[i];
     cout << "Min = " << min << endl;
     int m;
         cout << "Увеличение всех елементов массива на найденый минимум:" << endl;
    for(int i=0; i < 4; i++)
     {
     m=A[i] + min;
         cout << "A[" << i << "] + Min = " << m << endl;}
     }}
    else
    if(min < 1){
         cout << "Не было введено положительного числа, введите свое число, чтобы прибавить его к елементам массива" << endl;
        cin >> p;
        for(int i=0; i < 4; i++)
     {
     m=A[i] + p;
         cout << "A[" << i << "] + Min = " << m << endl;}}
system("PAUSE");
return 0;   
}



0



afront

1493 / 1208 / 821

Регистрация: 29.02.2016

Сообщений: 3,597

26.12.2017, 19:58

2

перепишите 13 строчку

C++
1
    int min = INT_MAX;



0



16 / 16 / 11

Регистрация: 28.10.2016

Сообщений: 75

26.12.2017, 20:26

3

Можно конкретнее, что работает неправильно?



0



0 / 0 / 0

Регистрация: 26.12.2017

Сообщений: 6

26.12.2017, 20:49

 [ТС]

4

массив не определяет положительные числа, считает минимальный элемент даже отрицательный.



0



7427 / 5021 / 2891

Регистрация: 18.12.2017

Сообщений: 15,694

26.12.2017, 21:05

5

Artem_Santos, почему сравниваете с 1 в неравенствах ?



0



1493 / 1208 / 821

Регистрация: 29.02.2016

Сообщений: 3,597

26.12.2017, 21:16

6

Artem_Santos, программа работает не правильно если А[0] – отрицательное число, которое в 13 строке заносится в min



1



1174 / 835 / 359

Регистрация: 26.02.2015

Сообщений: 3,743

26.12.2017, 21:21

7

И ещё, ТС, выучи наконец математику начальной школы. Действительными числами даже и не пахнет.



0



Yetty

7427 / 5021 / 2891

Регистрация: 18.12.2017

Сообщений: 15,694

27.12.2017, 02:51

8

Цитата
Сообщение от Nishen
Посмотреть сообщение

Действительными числами даже и не пахнет.

уже проходило

Цитата
Сообщение от Yetty
Посмотреть сообщение

почему сравниваете с 1 в неравенствах ?

начальным минимальным нужно делать первое встреченное положительное

Добавлено через 1 час 3 минуты
можно так:

C++
1
2
3
4
5
6
7
8
9
10
11
// формируем массив положительных
        int j=0;
        for (int i = 0; i < n; i++)          
        if (A[i]>0) 
        {
            C[j]=A[i];
            j=j+1;
        }
// вывод положительных на экран (для проверки)
        for (int i = 0; i < j; i++)
        cout << "C[" << i << "]" <<C[i];

C[0] и будет первым минимальным положительным

Добавлено через 12 минут
но прежде организуй ввод самого массива – по условию задачи он может быть произвольной длины

C++
1
2
3
4
5
6
cout <<"Enter n: "; cin >>n;
        // заполняем массив с клавиатуры
        for (int i = 0; i < n; i++) {
            cout << "A[" << i << "]" << ": ";
            cin >> A[i];
        }

Добавлено через 4 часа 3 минуты
собрал проверяйте должна работать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{    
        int n; 
        double A[1000], C[1000], f;
        cout <<"Enter n: "; cin >>n;
        // заполняем массив с клавиатуры
        for (int i = 0; i < n; i++) {
            cout << "A[" << i + 1 << "]" << ": ";
            cin >> A[i];
        }
        // выводим заполненный массив        
        for (int i = 0; i < n; ++i) 
            cout << A[i] << " ";
        // формируем массив положительных
        int j=0;
        for (int i = 0; i < n; i++)          
        if (A[i]>0) 
        {
            C[j]=A[i];
            j=j+1;
        }
        cout <<endl;
        if (j==0) {
            cout <<"dobavit: "; cin >> f;
        }
        else
        {        
// выводим положительные на экран (для проверки)        
        for (int i = 0; i < j; i++)        
        cout <<C[i]<<" ";
        cout <<endl;
// находим минимальное положительное       
        double mintek =C[0];
        for(int i=0; i < j; i++)        
        if (C[i]<=mintek) mintek=C[i];        
        cout <<"min a>0: "<<mintek<<endl;
        f=mintek;
        }
// увеличиваем элементы массива и выводим новый массив на экран
        for(int i=0; i < n; i++)
        {            
        A[i] = A[i] + f;
        cout <<A[i]<<" ";
        }
system("pause");
return 0;        
}



0



d1scret0

11 / 11 / 10

Регистрация: 26.12.2017

Сообщений: 48

27.12.2017, 08:56

9

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std;
 
int main() {
    int n;
    double k;
    cout << "Write n: "; cin >> n; // вводим размерность
    double *arr = new double[n]; // выделяем память под массив
//вводим массив с клавиатуры
    for (int i = 0; i < n; i++) {
        cout << "Write mass: "; cin >> arr[i];
    }
//объявляем минимальный и присваиваем его первому положительному элементу, также вводим number, в дальнейшем он нам поможет, и присваиваем ему +1 если найдем положительный элемент.
    double min;
        int number=0;
    for (int i = 0; i < n; i++) {
        if (arr[i] > 0) {
                        number ++;
            min = arr[i]; break;
        }
    }
// находим минимальный элемент из положительных чисел
    for (int i = 0; i < n; i++) {
        if (arr[i] > 0 && arr[i] < min) {
            min = arr[i];
        }
    }
    
 // проверяем, если number>0 то выводим минимальный элемент и прибавляем его, в ином случае, вводим k и прибавляемю
    if (number > 0) {
                cout << "nMin element : " << min << endl;
        for (int i = 0; i < n; i++) {
            arr[i] = arr[i] + min;
        }
    }
    else {
        cout << "nWrite K: "; cin >> k;
        for (int i = 0; i < n; i++) {
            arr[i] = arr[i] + k;
        }
    }
// выводим получившийся массив на консоль
    cout << "New mass: ";
    for (int i = 0; i < n; i++) {
        cout << arr[i] << " ";
    }
    system("pause");
    return 0;
}



0



7427 / 5021 / 2891

Регистрация: 18.12.2017

Сообщений: 15,694

27.12.2017, 14:21

10

d1scret0, зачем 2 идентичных блока на вывод?



0



11 / 11 / 10

Регистрация: 26.12.2017

Сообщений: 48

27.12.2017, 14:39

11

Yetty, В каком смысле два блока на вывод? Если он один. Если ты про тот который в начале, это что бы ты видел свой массив. Что бы знал с чем сравнивать



0



7427 / 5021 / 2891

Регистрация: 18.12.2017

Сообщений: 15,694

27.12.2017, 14:47

12

Цитата
Сообщение от d1scret0
Посмотреть сообщение

В каком смысле два блока на вывод?

в смысле строки 34-35 и 40-41 – я не придираюсь, просто на самом деле хотелось бы видеть наиболее оптимальный код



0



11 / 11 / 10

Регистрация: 26.12.2017

Сообщений: 48

27.12.2017, 14:49

13

rofl, Ты где нибудь там слово cout видел? Я конечно не придираюсь, но как можно перепутать сумму и вывод. Ты указал мне на цикл, в цикле может быть все что угодно. А cout перед циклом, к нему не принадлежит



0



7427 / 5021 / 2891

Регистрация: 18.12.2017

Сообщений: 15,694

27.12.2017, 15:01

14

Цитата
Сообщение от d1scret0
Посмотреть сообщение

как можно перепутать сумму и вывод

бывает просто я хотел бы оставить наиболее оптимальный вариант (свой и ли твой) для меня один из критериев – количество строк. хотел увидеть сколько будет в твоей строк если убрать дубль-блок



0



11 / 11 / 10

Регистрация: 26.12.2017

Сообщений: 48

27.12.2017, 15:20

15

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



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

27.12.2017, 15:20

Помогаю со студенческими работами здесь

Найти сумму, максимум, минимум, среднее значение элементов массива
найти сумму, максимум, минимум , среднее значение єлементов массива.

Найти количество положительных элементов массива; найти сумму элементов, расположенных после заданного
В одномерном массиве, состоящем из n целых элементов, вычислить:
1) Количество положительных…

Определить, сколько из элементов массива кратны M и больше N, и найти минимум из найденых
Пожалуйста, горю-ю-ю, завтра уже сдавать, если честно – плохо понимаю.
Я учусь на учителя по…

Найти сумму положительных элементов массива и количество этих элементов
Задан массив d. Найти сумму корней положительных элементов массива и количество этих элементов .

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

15

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

В блоке 1 дополнительным переменным maxиmin, в которых
будут храниться максимальное и минимальное
значения соответственно, присваивается
значение 1-го элемента массива. Кроме
этого введены еще две переменныеimaxиimin, которые будут
использоваться для хранения номеров
максимального и минимального элементов
массива. С помощью блока модификации
(блок 2) организовывается цикл по перебору
элементов массива Х (перебор начинается
со 2-го элемента, так как 1-й элемент уже
обработан в блоке 1). Если текущий элемент
массиваXiбольше значения, которое хранится в
переменнойmax(блок 3), то за максимум принимается
значение этого элемента:max=Xi,
и запоминается его номер:imax=i(блок 4). Если текущий элемент массива
не больше максимума, то проверяется, не
меньше ли он минимума (блок 5). В случае
если текущий элементXiокажется меньше минимального значения,
которое хранится в переменнойmin,
то за минимум принимается значение
этого элемента:min=Xi,
и запоминается его номер:imin=i(блок 6). После выхода из цикла будут
выведены значения максимального и
минимального элементов, а также их
номера в массиве (блок 7).

Приведенный
выше алгоритм имеет один недостаток –
в нем используется две лишние переменныеmaxиmin.
Зная индекс элемента массива всегда
можно получить его значение, поэтому
нет необходимости хранить максимальное
и минимальное значения в отдельных
переменных. Оптимальный алгоритм
приведен на рис. 5.2.2.

В блоке 1 дополнительным переменным
imaxиimin,
используемых для хранения номеров
максимального и минимального элемента,
присваивается значение 1. Таким образом,
за максимум и минимум принимается 1-й
элемент массива, само же значение этого
элемента нигде дополнительно не
сохраняется. Оставшиеся элементы массива
также перебираются, начиная со второго
(блок 2). При этом каждый элемент массиваXi
сравнивается с
элементами, имеющими номер равныйimax(блок 3) иimin(блок
6), т.е. с элементами принятыми за максимум
(минимум). Если результат проверки
условий является истиной, то в переменныхimaxиiminсохраняются индексы новых максимального
(блок 4) и минимального (блок 6) элементов.
После выхода из цикла будут выведены
значения максимального и минимального
элементов, а также их номера в массиве
(блок 7).

Если в массиве имеется несколько
элементов равных по значению максимальному
(минимальному) элементу, то алгоритмы,
приведенные на рис 5.2.1 и 5.2.2, определят
позицию только первого такого элемента.
Например, чтобы найти количество
элементов массива равных максимальному
и позицию последнего такого элемента,
можно воспользоваться алгоритмом,
приведенным на рис. 5.2.3.

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

Вначале текущий элемент массива Xiсравнивается с максимальным (блок 3).
Если он оказывается больше элемента,
принятого за максимальный, то запоминается
номер этого элемента и переменнойkприсваивается 1 (блок 4). Это означает,
что встретился первый «новый» максимальный
элемент.

Если текущий элемент не больше максимума,
значит, он может быть равным или меньше
максимального элемента. Поэтому в блоке
5 текущий элемент массива Xi
проверяется на равенство
максимальному. Если он оказывается
равным максимуму, то опять запоминается
номер текущего элемента и значение
переменнойkувеличивается на 1 (блок 6). Это означает,
что встретился следующий элемент равный
максимальному элементу. В итоге после
выхода из цикла в переменнойimaxбудет храниться индекс последнего по
счету элемента равного максимальному,
а в переменнойkколичество элементов, равных максимуму.
Если же из блока 6 убрать операциюimax=i,
то в переменнойimax,
как и в предыдущих примерах будет
сохранен номер первого по счету элемента
равного максимальному.

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

Пример 5.2.В массиве Х [N]
найти минимальный положительный элемент.

Массив
Х может содержать как положительные,
так и отрицательные элементы. Поэтому
неизвестно какой элемент массива или
произвольное значение можно принять
за начальный минимум. Решение поставленной
задачи можно разбить на два этапа: поиск
положительных элементов в массиве с
определением первого такого элемента
и поиск среди положительных элементов
минимального по значению. Блок-схема
алгоритма приведена на рис. 5.2.4.

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

В блоке 3 проверяется, не является ли
текущий элемент массива Xiположительным. Если он отрицательный
или равен нулю, то такой элемент
пропускается и над ним не выполняется
никаких действий. ЕслиXi> 0, то в блоке 4 проверяется, не является
ли этот элемент первым встретившимся
положительным элементом массива
(признаком чего служит значениеiminравное 0). В этом случае в блоке 5 переменнойiminбудет присвоено
текущее значениеi.
Таким образом, за начальное значение
для минимума будет принято значение
первого по счету положительного элемента
массива Х. Эта ситуация может возникнуть
только один раз, и при дальнейшей работе
цикла блок 5 больше выполняться не будет.
Остальные положительные элементы
массива в блоке 6 будут сравниваться с
элементом массива, принятым в текущий
момент за минимум. Если такой элемент
окажется меньше минимального, то в блоке
7 в переменнойiminбудет сохранен его номерi.

После выхода из цикла проверяется, не
равно ли значение iminнулю (блок 8), так как сразу же выводить
значение минимального элемента массиваXimin
и его номерimin(блок 9) нельзя. Это объясняется тем что,
если в массиве Х не будет положительных
элементов, то значение переменнойiminостанется равным нулю, а обращение к
несуществующему элементу массиваХ0не допустимо.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

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

1 способ

Задача 1: Дан одномерный массив, состоящий из n целых чисел. Найти минимальный элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводятся сами числа, заданные случайным образом. В третьей строке выводится результат: минимальный элемент массива.

Исходные данные:

Результат:

10
5  -2  14  7  -4  23  0  8  6  -1

-4

10
0  4  5  2  77  62  4  8  0  45

0

Считаем, что первый элемент массива – минимальный.  Затем, сравниваем, начиная со второго до последнего все элементы массива с минимальным. Используем для этого цикл. Если очередной элемент на каком-то шаге цикла оказывается меньше минимального, то значение минимального изменяем, присвоив ему значение этого очередного элемента. По окончании цикла выводим результат: минимальный элемент.

program min1;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then min:=a[i];
//вывод результата
writeln;
write(min);
end.

Заметим, что для нахождения максимального элемента массива достаточно заменить имя переменной min на max и знак >= на знак <=.

Задача 2: Дан одномерный массив, состоящий из n целых чисел. Найти индекс минимального элемент массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: индекс минимального элемент массива.

Исходные данные:

Результат:

10
5  -2  14  7  -4  23  0  8  6  -1

5

10
0  4  5  2  77  62  4  8  0  45

9

Если в задаче требуется найти индекс минимального (максимального), то вводим переменную imin, в которую будем запоминать индекс минимального (максимального), причем первоначально ее значение равно 1.

program min2;
var a:array[1..100] of integer;
i,min,n,imin:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-100,100);
write(a[i],’ ‘);
end;
//нахождение индекса минимального элемента массива
min:=a[1];
imin:=1;
for i:=2 to n do
if min>=a[i] then begin
imin:=i;
min:=a[i];
end;
//вывод результата
writeln;
write(imin);
end.

Если в массиве есть несколько равных между собой минимальных элементов, то данная программа найдет номер последнего (правого) элемента. Для того чтобы найти индекс первого (левого) элемента достаточно изменить знак  >= на строгий знак >.
Эту программу можно оптимизировать, так как, зная индекс минимального элемента, можно найти значение минимального элемента массива. Значит, переменная min не нужна:

var a:array[1..100] of integer;
i,n,imin:integer;

Фрагмент нахождения индекса минимального элемента массива выглядит так:

imin:=1;
for i:=2 to n do
if a[imin]>=a[i] then imin:=i;

Задача 3: Дан одномерный массив, состоящий из n целых чисел. Найти количество минимальных элементов массива. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: количество минимальных элементов массива.

Исходные данные:

Результат:

10
5  -2  14  7  -4  23  0  8  -4  -1

2

10
0  4  5  2  77  0  4  8  0  45

3

program min3;
var a:array[1..100] of integer;
i,min,n,k:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(-5,5);
write(a[i],’ ‘);
end;
//нахождение минимального элемента массива
min:=a[1];
for i:=2 to n do
if min>=a[i] then
min:=a[i];
//считаем количество равных элементов
k:=0;
for i:=1 to n do
if a[i]=min then k:=k+1;
//вывод результата
writeln;
write(k);
end.

Задача 4: Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 1000. Напишите программу, находящую минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не кратно четырем. В первой строке вводится количество чисел в массиве n. Затем выводится массив, заданный случайным образом. В третьей строке выводится результат: минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на четыре.

Исходные данные:

Результат:

10
5  -2  14  7  -4  22  0  -8  -6  -1

-6

10
0  4  5  -10  77  0  4  -12  0  45

-10

В этой задаче первый способ нахождения минимального не подойдет. Первый элемент массива может оказаться меньше, чем минимальный четный и не кратный четырем и программа выведет неверный результат. Каким должно быть начальное значение переменной min? Его нужно выбрать таким, чтобы для первого же «подходящего» элемента выполнилось условие a[i] < min, и это «временное» начальное значение было бы заменено на реальное. Такое «подходящее» обязательно будет, так как это гарантировано условием задачи. Оно должно быть большим и таким, какое не может быть по условию задачи, например, 1001.

Кроме того заметим, что задавать элементы массива нужно с клавиатуры, чтобы обеспечить условия задачи.

Итак, находим минимальный элемент вторым способом.

2 способ

Записываем в переменную min значение 1001. Затем в цикле просматриваем все элементы массива, с первого до последнего. Если остаток от деления очередного элемента на 2 равен 0 и остаток от его деления на 4 не равен нулю и значение элемента меньше, чем значение переменной min, сохраняем в переменную min значение очередного элемента массива. После окончания работы цикла выводим значение переменной min.

program min4;
var a:array[1..100] of integer;
i,min,n:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение минимального элемента массива
min:=1001;
for i:=1 to N do
if (a[i] mod 2=0) and (a[i] mod 4 <> 0) and (a[i]<min) then
  min:=a[i];
//вывод результата
writeln;
write(min);
end.

Проверяем на тестах:

10
411 837 755 90 520 203 581 798 401 640

90

10
195 264 127 936 658 152 339 504 395 553

658

 Конечно, решить эту задачу можно и первым способом, но для нахождения первого значения min нужно написать дополнительные команды поиска. Вот таким может быть решение:

program min5;
var a:array[1..100] of integer;
i,min,n,j:integer;
begin
//заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do
readln(a[i]);
for i:=1 to n do
write(a[i],’ ‘);
//нахождение первого четного и не кратного 4 числа
i:=1;
while (i<=n)and not((a[i] mod 2=0) and (a[i] mod 4 <> 0)) do i:=i+1;
//в переменной i запомнился номер первого элемента, удовлетворяющего условию
//нахождение минимального, начиная со следующего за найденным
min:=a[i];
for j:=i+1 to N do
if (a[j] mod 2=0) and (a[j] mod 4 <> 0) and (a[j]<min) then
  min:=a[j];
//вывод результата
writeln;
write(min);
end.

Задача 5: Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит второй максимум массива (элемент, который в отсортированном по невозрастанию массиве стоял бы вторым).

Исходные данные:

Результат:

10
5  -2  14  7  -4  22  0  -8  -6  -1

14

10
0  4  5  -10  77  0  4  -12  0  45

45

Мы знаем, как найти первый максимум, а в этой задаче нужно найти второй по величине максимум. Попробуем это сделать это за один проход по массиву. Нам нужны две переменные, max1 (максимальный элемент) и max2 (второй максимум). Сначала выбираем максимальный из первых двух элементов и записываем его значение в max1, а второй по величине записываем в max2.

Затем в цикле перебираем все элементы, начиная с 3-го до последнего. Если очередной элемент a[i] больше, чем max1, записываем значение max1 в max2 (предыдущий максимум становится вторым), а значение a[i] – в max1. Иначе, если a[i] больше, чем max2, записываем значение a[i] в max2. После завершения цикла выводим значение переменной max2.

program min6;
var a: array [1..100] of integer;
i, k,n, max1, max2: integer;
begin
  //заполнение массива и вывод массива в строчку
readln(n);
for i:=1 to n do begin
a[i]:=random(0,100);
write(a[i],’ ‘);
end;
//начальные значения max1 и max2
if a[1] > a[2] then begin
max1:=a[1]; max2:=a[2]
end
else begin
max1:=a[2]; max2:=a[1]
end;
// поиск второго максимального
for i:=3 to N do
if a[i] > max1 then begin
max2:= max1;
max1:= a[i]
end
else
if a[i] > max2 then max2:=a[i];
//вывод результата
writeln;
writeln(max2);
end.

Задача 6: Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести минимальный элемент массива, шестнадцатеричная запись которого содержит ровно две цифры, причём первая (старшая) цифра больше второй (младшей).  Если таких чисел нет, нужно вывести ответ 0.

Исходные данные:

Результат:

20
5  -2  14  7  -4  22  0  -8  -6  -1

14

10
0  4  5  -10  77  0  4  -12  0  45

45

Эта задача усложнена только тем, что элементы массива должны быть в диапазоне от 16 до 255. В этом случае первая цифра находится как результат деления нацело на 16, а вторая цифра – как остаток от деления на 16.

Кроме этого здесь массив можно объявить через константу n, так как размер массива задан явно: 20 элементов.

program z6;
//объявление массива через константу
const n=20;
var a: array [1..n] of integer;
i,min: integer;
begin
  //заполнение массива и вывод массива в строчку
for i:=1 to n do begin
a[i]:=random(0,10000);
write(a[i],’ ‘);
end;
writeln;
min := 10001;
for i := 1 to n do begin
//для проверки правильности программы выведем две шестнадцатеричные цифры:
//write(a[i] div 16,a[i] mod 16,’ ‘);
if (16 <= a[i]) and (a[i] < 256) and (a[i] div 16 > a[i] mod 16) and (a[i] < min) then
    min := a[i];
end;
writeln;
//вывод результата
if min = 10001 then
  writeln(0)
else
  writeln(min);
end.

Задачи для самостоятельного решения:

  1. Дан целочисленный массив из n элементов. Элементы могут принимать значения от 150 до 210 ­– рост учащихся выпускного класса. В волейбольную команду берут тех, чей рост не менее 170 см. Напишите программу, которая определяет и выводит минимальный рост игрока баскетбольной команды. Гарантируется, что хотя бы один ученик играет в баскетбольной команде.
  2. Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 0 до 100 – баллы учащихся выпускного класса за экзамен по информатике. Для получения положительной оценки за экзамен требовалось набрать не менее 50 баллов. Напишите программу, которая находит и выводит минимальный балл среди учащихся, получивших за экзамен положительную оценку. Известно, что в классе хотя бы один учащийся получил за экзамен положительную оценку.
  3. Дан целочисленный массив – сведения о температуре за каждый день октября. Элементы массива могут принимать целочисленные значение значения от -15 до 20. Напишите программу, которая находит и выводит максимальную температуру среди дней, когда были заморозки (температура опускалась ниже нуля). Гарантируется, что хотя бы один день в октябре была отрицательная температура.
  4. Дан целочисленный массив из n элементов, все элементы которого – неотрицательные числа, не превосходящие 10000. Напишите программу, которая находит и выводит минимальное трехзначное число, записанное в этом массиве. Если таких чисел нет, нужно вывести сообщение «Таких чисел нет».
  5. Дан целочисленный массив из n элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, позволяющую найти и вывести наибольший из элементов массива, шестнадцатеричная запись которого оканчивается на букву F. Если таких чисел нет, нужно вывести ответ 0.
  6. Дан целочисленный массив из n элементов. Элементы массива могут принимать произвольные целые значения. Напишите программу, которая находит и выводит номера двух элементов массива, сумма которых минимальна.
  7. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 1 до 10000 включительно. Напишите программу, находящую минимальный элементов массива, шестнадцатеричная запись которого содержит ровно две цифры, причём вторая (младшая) цифра – это буква (от A до F). Если таких чисел нет, нужно вывести ответ 0.

Источники информации

  1. Угринович Н.Д. Информатика и информационные технологии. Учебник для 10-11 классов/ Н.Д. Угринович. – М.:Бином. Лаборатория знаний, 2005.
  2. Сайт К. Полякова http://kpolyakov.spb.ru/school/ege.htm

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

Примеры

 Input:  {2, 3, 7, 6, 8, -1, -10, 15}
 Output: 1

 Input:  { 2, 3, -7, 6, 8, 1, -10, 15 }
 Output: 4

 Input: {1, 1, 0, -1, -2}
 Output: 2 

Наивным методом решения этой проблемы является поиск всех натуральных чисел, начиная с 1 в данном массиве. Возможно, нам придется искать не более n + 1 чисел в данном массиве. Таким образом, это решение принимает O (n ^ 2) в худшем случае.

Мы можем использовать сортировку, чтобы решить ее в меньшей сложности. Мы можем отсортировать массив за O (nLogn) время. Как только массив отсортирован, все, что нам нужно сделать, — это линейное сканирование массива. Таким образом, этот подход занимает O (nLogn + n) время, которое равно O (nLogn).

Мы также можем использовать хеширование . Мы можем построить хеш-таблицу всех положительных элементов в данном массиве. После того, как хэш-таблица построена. Мы можем посмотреть в хеш-таблице все положительные целые числа, начиная с 1. Как только мы находим число, которого нет в хеш-таблице, мы возвращаем его. Этот подход может занять в среднем O (n) времени, но требует O (n) дополнительного пространства.

AO (n) время и O (1) дополнительное пространство решение:
Идея похожа на этот пост. Мы используем элементы массива в качестве индекса. Чтобы отметить наличие элемента x, мы меняем значение в индексе x на отрицательное . Но этот подход не работает, если есть неположительные (-ve и 0) числа. Таким образом, мы отделяем положительные числа от отрицательных в качестве первого шага, а затем применяем подход.

Ниже приведен двухшаговый алгоритм.
1) Отделите положительные числа от других, т. Е. Переместите все неположительные числа в левую сторону. В следующем коде функция segregate () выполняет эту часть.
2) Теперь мы можем игнорировать неположительные элементы и рассматривать только ту часть массива, которая содержит все положительные элементы. Обходим массив, содержащий все положительные числа и, чтобы отметить наличие элемента x, мы меняем знак значения в индексе x на отрицательный. Мы снова обходим массив и печатаем первый индекс, который имеет положительное значение . В следующем коде функция findMissingPositive () выполняет эту часть. Обратите внимание, что в findMissingPositive мы вычли 1 из значений, так как индексы начинаются с 0 в C.

C ++

#include <bits/stdc++.h>

using namespace std;

void swap(int* a, int* b)

{

    int temp;

    temp = *a;

    *a = *b;

    *b = temp;

}

int segregate(int arr[], int size)

{

    int j = 0, i;

    for (i = 0; i < size; i++) {

        if (arr[i] <= 0) {

            swap(&arr[i], &arr[j]);

            j++;

        }

    }

    return j;

}

int findMissingPositive(int arr[], int size)

{

    int i;

    for (i = 0; i < size; i++) {

        if (abs(arr[i]) - 1 < size && arr[abs(arr[i]) - 1] > 0)

            arr[abs(arr[i]) - 1] = -arr[abs(arr[i]) - 1];

    }

    for (i = 0; i < size; i++)

        if (arr[i] > 0)

            return i + 1;

    return size + 1;

}

int findMissing(int arr[], int size)

{

    int shift = segregate(arr, size);

    return findMissingPositive(arr + shift, size - shift);

}

int main()

{

    int arr[] = { 0, 10, 2, -10, -20 };

    int arr_size = sizeof(arr) / sizeof(arr[0]);

    int missing = findMissing(arr, arr_size);

    cout << "The smallest positive missing number is " << missing;

    return 0;

}

С

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

void swap(int* a, int* b)

{

    int temp;

    temp = *a;

    *a = *b;

    *b = temp;

}

int segregate(int arr[], int size)

{

    int j = 0, i;

    for (i = 0; i < size; i++) {

        if (arr[i] <= 0) {

            swap(&arr[i], &arr[j]);

            j++;

        }

    }

    return j;

}

int findMissingPositive(int arr[], int size)

{

    int i;

    for (i = 0; i < size; i++) {

        if (abs(arr[i]) - 1 < size && arr[abs(arr[i]) - 1] > 0)

            arr[abs(arr[i]) - 1] = -arr[abs(arr[i]) - 1];

    }

    for (i = 0; i < size; i++)

        if (arr[i] > 0)

            return i + 1;

    return size + 1;

}

int findMissing(int arr[], int size)

{

    int shift = segregate(arr, size);

    return findMissingPositive(arr + shift, size - shift);

}

int main()

{

    int arr[] = { 0, 10, 2, -10, -20 };

    int arr_size = sizeof(arr) / sizeof(arr[0]);

    int missing = findMissing(arr, arr_size);

    printf("The smallest positive missing number is %d ", missing);

    getchar();

    return 0;

}

Джава

import java.util.*;

class Main {

    static int segregate(int arr[], int size)

    {

        int j = 0, i;

        for (i = 0; i < size; i++) {

            if (arr[i] <= 0) {

                int temp;

                temp = arr[i];

                arr[i] = arr[j];

                arr[j] = temp;

                j++;

            }

        }

        return j;

    }

    static int findMissingPositive(int arr[], int size)

    {

        int i;

        for (i = 0; i < size; i++) {

            int x = Math.abs(arr[i]);

            if (x - 1 < size && arr[x - 1] > 0)

                arr[x - 1] = -arr[x - 1];

        }

        for (i = 0; i < size; i++)

            if (arr[i] > 0)

                return i + 1;

        return size + 1;

    }

    static int findMissing(int arr[], int size)

    {

        int shift = segregate(arr, size);

        int arr2[] = new int[size - shift];

        int j = 0;

        for (int i = shift; i < size; i++) {

            arr2[j] = arr[i];

            j++;

        }

        return findMissingPositive(arr2, j);

    }

    public static void main(String[] args)

    {

        int arr[] = { 0, 10, 2, -10, -20 };

        int arr_size = arr.length;

        int missing = findMissing(arr, arr_size);

        System.out.println("The smallest positive missing number is " + missing);

    }

}

C #

using System;

class main {

    static int segregate(int[] arr, int size)

    {

        int j = 0, i;

        for (i = 0; i < size; i++) {

            if (arr[i] <= 0) {

                int temp;

                temp = arr[i];

                arr[i] = arr[j];

                arr[j] = temp;

                j++;

            }

        }

        return j;

    }

    static int findMissingPositive(int[] arr, int size)

    {

        int i;

        for (i = 0; i < size; i++) {

            if (Math.Abs(arr[i]) - 1 < size && arr[ Math.Abs(arr[i]) - 1] > 0)

                arr[ Math.Abs(arr[i]) - 1] = -arr[ Math.Abs(arr[i]) - 1];

        }

        for (i = 0; i < size; i++)

            if (arr[i] > 0)

                return i + 1;

        return size + 1;

    }

    static int findMissing(int[] arr, int size)

    {

        int shift = segregate(arr, size);

        int[] arr2 = new int[size - shift];

        int j = 0;

        for (int i = shift; i < size; i++) {

            arr2[j] = arr[i];

            j++;

        }

        return findMissingPositive(arr2, j);

    }

    public static void Main()

    {

        int[] arr = { 0, 10, 2, -10, -20 };

        int arr_size = arr.Length;

        int missing = findMissing(arr, arr_size);

        Console.WriteLine("The smallest positive missing number is " + missing);

    }

}

Выход:

The smallest positive missing number is 1 

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

Другой подход: в этой задаче мы создали список, полный 0 с размером значения max () нашего данного массива. Теперь, когда мы сталкиваемся с любым положительным значением в нашем исходном массиве, мы меняем значение индекса нашего списка на 1. Итак, после того, как мы закончим, мы просто перебираем наш измененный список, первый 0, с которым мы сталкиваемся, его (значение индекса + 1) должен быть наш ответ, так как индекс в Python начинается с 0.

Ниже приведена реализация вышеуказанного подхода:

C ++

#include <bits/stdc++.h>

using namespace std;

int firstMissingPos(int A[], int n)

{

    bool present[n + 1] = { false };

    for (int i = 0; i < n; i++) {

        if (A[i] > 0 && A[i] <= n)

            present[A[i]] = true;

    }

    for (int i = 1; i <= n; i++)

        if (!present[i])

            return i;

    return n + 1;

}

int main()

{

    int A[] = { 0, 10, 2, -10, -20 };

    int size = sizeof(A) / sizeof(A[0]);

    cout << firstMissingPos(A, size);

}

Джава

import java.util.Arrays;

public class GFG {

    static int solution(int[] A)

    {

        int m = Arrays.stream(A).max().getAsInt();

        if (m < 1)

        {

            return 1;

        }

        if (A.length == 1) {

            if (A[0] == 1) {

                return 2;

            }

            else {

                return 1;

            }

        }

        int i = 0;

        int[] l = new int[m];

        for (i = 0; i < A.length; i++) {

            if (A[i] > 0) {

                if (l[A[i] - 1] != 1)

                {

                    l[A[i] - 1] = 1;

                }

            }

        }

        for (i = 0; i < l.length; i++)

        {

            if (l[i] == 0) {

                return i + 1;

            }

        }

        return i + 2;

    }

    public static void main(String[] args)

    {

        int A[] = { 0, 10, 2, -10, -20 };

        System.out.println(solution(A));

    }

}

Python 3

def solution(A):

    m = max(A)

    if m < 1:

        return 1 

    if len(A) == 1:

        return 2 if A[0] == 1 else 1     

    l = [0] * m

    for i in range(len(A)):

        if A[i] > 0:

            if l[A[i] - 1] != 1:

                l[A[i] - 1] = 1 

    for i in range(len(l)):

        if l[i] == 0

            return i + 1

    return i + 2     

A = [0, 10, 2, -10, -20]

print(solution(A))

C #

using System;

using System.Linq;

class GFG {

    static int solution(int[] A)

    {

        int m = A.Max();

        if (m < 1) {

            return 1;

        }

        if (A.Length == 1) {

            if (A[0] == 1) {

                return 2;

            }

            else {

                return 1;

            }

        }

        int i = 0;

        int[] l = new int[m];

        for (i = 0; i < A.Length; i++) {

            if (A[i] > 0) {

                if (l[A[i] - 1] != 1) {

                    l[A[i] - 1] = 1;

                }

            }

        }

        for (i = 0; i < l.Length; i++) {

            if (l[i] == 0) {

                return i + 1;

            }

        }

        return i + 2;

    }

    public static void Main()

    {

        int[] A = { 0, 10, 2, -10, -20 };

        Console.WriteLine(solution(A));

    }

}

PHP

<?php 

function solution($A){

    $m = max($A);

    if ($m < 1)

    {         

        return 1;

    }

    if (sizeof($A) == 1)

    {  

        if ($A[0] == 1)

            return 2 ;

        else 

            return 1 ;

    }        

    $l = array_fill(0, $m, NULL);

    for($i = 0; $i < sizeof($A); $i++)

    {        

        if( $A[$i] > 0)

        {

            if ($l[$A[$i] - 1] != 1)

            {

                $l[$A[$i] - 1] = 1;

            }

        }

    }

    for ($i = 0;$i < sizeof($l); $i++)

    {

        if ($l[$i] == 0) 

            return $i+1;

    }

    return $i+2;    

}

$A = array(0, 10, 2, -10, -20);

echo solution($A);

return 0;

?>

Выход:

 1 

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

  • Найти наименьшее положительное число, отсутствующее в несортированном массиве | Набор 2
  • Найти наименьшее положительное число, отсутствующее в несортированном массиве | Набор 3
  • Найдите наименьшее положительное число, отсутствующее в несортированном массиве: реализация хеширования
  • Найдите наименьшее пропущенное число
  • Наименьшее простое число отсутствует в массиве
  • Найдите наименьшее положительное целочисленное значение, которое не может быть представлено как сумма любого подмножества данного массива
  • Найдите наименьшее положительное число, которое не может быть представлено заданными цифрами
  • k-й отсутствующий элемент в несортированном массиве
  • Найти пропущенное число в другом массиве, который является перемешанной копией
  • Найти пропущенное число в отсортированном массиве ограниченного диапазона
  • K’th самый маленький / самый большой элемент в несортированном массиве | Комплект 1
  • kth самый маленький / самый большой в малом диапазоне несортированный массив
  • K’th самый маленький / самый большой элемент в несортированном массиве | Набор 2 (ожидаемое линейное время)
  • K’th самый маленький / самый большой элемент в несортированном массиве | Набор 3 (наихудший случай линейного времени)
  • Найти недостающее целое число в массиве, если указано среднее

Найти наименьшее положительное число, отсутствующее в несортированном массиве | Комплект 1

0.00 (0%) 0 votes

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