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

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Given an array of integers containing duplicate elements. The task is to find the sum of all least occurring elements in the given array. That is the sum of all such elements whose frequency is minimum in the array.
    Examples

    Input : arr[] = {1, 1, 2, 2, 3, 3, 3, 3}
    Output : 2
    The least occurring element is 1 and 2 and it's number
    of occurrence is 2. Therefore sum of all 1's and 2's in the 
    array = 1+1+2+2 = 6.
    
    Input : arr[] = {10, 20, 30, 40, 40}
    Output : 60
    Elements with least frequency are 10, 20, 30.
    Their sum = 10 + 20 + 30 = 60.

    Approach

    • Traverse the array and use a unordered_map in C++ to store the frequency of elements of the array such that the key of map is the array element and value is its frequency in the array.
    • Then, traverse the map to find the frequency of the minimum occurring element.
    • Now, to find the sum traverse the map again and for all elements with minimum frequency find frequency_of_min_occurring_element*min_occurring_element and find their sum.

    Below is the implementation of the above approach: 

    C++

    #include <bits/stdc++.h>

    using namespace std;

    int findSum(int arr[], int N)

    {

        unordered_map<int, int> mp;

        for (int i = 0; i < N; i++)

            mp[arr[i]]++;   

        int minFreq = INT_MAX;

        for (auto itr = mp.begin(); itr != mp.end(); itr++) {

            if (itr->second < minFreq) {

                minFreq = itr->second;

            }

        }

        int sum = 0;

        for (auto itr = mp.begin(); itr != mp.end(); itr++) {

            if (itr->second == minFreq) {

                sum += itr->first * itr->second;

            }

        }

        return sum;

    }

    int main()

    {

        int arr[] = { 10, 20, 30, 40, 40 };

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

        cout << findSum(arr, N);

        return 0;

    }

    Java

    import java.util.Collections;

    import java.util.Comparator;

    import java.util.HashMap;

    import java.util.Iterator;

    import java.util.Map;

    class GFG

    {

    static int findSum(int arr[], int N)

    {

        Map<Integer,Integer> mp = new HashMap<>();

        for (int i = 0; i < N; i++)

            mp.put(arr[i],mp.get(arr[i])==null?1:mp.get(arr[i])+1);

        int minFreq = Integer.MAX_VALUE;

        minFreq = Collections.min(mp.entrySet(),

                Comparator.comparingInt(Map.Entry::getKey)).getValue();

        int sum = 0;

        for (Map.Entry<Integer,Integer> entry : mp.entrySet())

        {

            if (entry.getValue() == minFreq)

            {

                sum += entry.getKey() * entry.getValue();

            }

        }

        return sum;

    }

    public static void main(String[] args)

    {

        int arr[] = { 10, 20, 30, 40, 40 };

        int N = arr.length;

        System.out.println( findSum(arr, N));

    }

    }

    Python3

    import math as mt

    def findSum(arr, N):

        mp = dict()

        for i in arr:

            if i in mp.keys():

                mp[i] += 1

            else:

                mp[i] = 1

        minFreq = 10**9

        for itr in mp:

            if mp[itr]< minFreq:

                minFreq = mp[itr]

        Sum = 0

        for itr in mp:

            if mp[itr]== minFreq:

                Sum += itr * mp[itr]

        return Sum

    arr = [ 10, 20, 30, 40, 40]

    N = len(arr)

    print(findSum(arr, N))

    C#

    using System;

    using System.Collections.Generic;

    class GFG{

    static int findSum(int[] arr, int N)

    {

        Dictionary<int,

                   int> mp = new Dictionary<int,

                                            int>(); 

        for(int i = 0; i < N; i++)

        {

            if (mp.ContainsKey(arr[i]))

            {

                mp[arr[i]]++;

            }

            else

            {

                mp.Add(arr[i], 1);

            }

        }

        int minFreq = Int32.MaxValue;

        foreach(KeyValuePair<int, int> itr in mp)

        {

            if (itr.Value < minFreq)

            {

                minFreq = itr.Value;

            }

        }

        int sum = 0;

        foreach(KeyValuePair<int, int> itr in mp)

        {

            if (itr.Value == minFreq)

            {

                sum += itr.Key * itr.Value;

            }

        }

        return sum;

    }

    static void Main()

    {

        int[] arr = { 10, 20, 30, 40, 40 };

        int N = arr.Length;

        Console.Write(findSum(arr, N));

    }

    }

    Javascript

    <script>

    function findSum(arr,N)

    {

        let mp = new Map();

        for (let i = 0 ; i < N; i++)

        {

            if(mp.has(arr[i]))

            {

                mp.set(arr[i], mp.get(arr[i])+1);

            }

            else

            {

                mp.set(arr[i], 1);

            }

        }

        let minFreq = Number.MAX_VALUE;

        for (let [key, value] of mp.entries())

        {

            if (value < minFreq)

            {

                minFreq = value;

            }

        }

        let sum = 0;

        for (let [key, value] of mp.entries())

        {

            if (value == minFreq)

            {

                sum += key * value;

            }

        }

        return sum;

    }

    let arr=[ 10, 20, 30, 40, 40 ];

    let N = arr.length;

    document.write(findSum(arr, N));

    </script>

    Time Complexity: O(N), where N is the number of elements in the array.

    Auxiliary Space: O(N) because it is using unordered_map “mp”
     

    Last Updated :
    05 Sep, 2022

    Like Article

    Save Article

    Способ решения имеющий сложность O(N * log(N)).

    #include <stdio.h>
    #include <stdlib.h>
    
    int cmp(const void* a, const void* b)
    {
        return *(int*)a - *(int*)b;
    }
    
    int main(void)
    {
        static int A[300000];
        int N;
    
        scanf("%d", &N);
        for (int i = 0; i < N; ++i)
            scanf("%d", &A[i]);
    
        qsort(A, N, sizeof(int), cmp);
    
        long long sum_elements = 0;
        long long sum_type_a = 0;
        long long sum_type_b = 0;
        long long sum_type_c = 0;
        for (int i = 0; i < N; ++i)
        {
            sum_type_a += (long long)A[i] * (N - 1 - i);
            sum_type_b += (long long)A[i] * (N - 1 - i) + A[i];
            sum_type_c += (long long)A[i] * (N - 1 - i) + A[i] + sum_elements;
            sum_elements += A[i];
        }
    
        printf("%lldn", sum_type_a);
        printf("%lldn", sum_type_b);
        printf("%lldn", sum_type_c);
    }
    

    Тут выводится три суммы.
    Первая сумма считается в предположении, что если мы учли пару (A[i], A[j]), то пару (A[j], A[i]) учитывать не нужно. Также первая сумма не учитывает пары вида (A[i], A[i]).
    Вторая сумма аналогична первой, но учитывает пары вида (A[i], A[i]).
    Третья сумма аналогична второй, но учитывает обе пары (A[i], A[j]) и (A[j], A[i]).
    Не знаю, какую именно сумму вам нужно найти…

    На входных данных

    5
    1 2 3 4 5
    

    Будет следующий вывод:

    20
    35
    55
    

    A_Hatake

    3 / 3 / 0

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

    Сообщений: 85

    1

    Как найти сумму всех минимумов в массиве?

    26.11.2020, 21:36. Показов 2074. Ответов 15

    Метки массив, минимум, си, сумма (Все метки)


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

    Дан массив А, в котором содержится N целых чисел. Нужно перебрать все пары чисел A[i] и A[j] в этом массиве, для каждой пары найти минимум, и сложить вместе эти минимумы. В первой строке записано целое число N – количество элементов в массиве. Далее записаны N этих чисел массива через пробел(где 1<=N<=300000). Все числа не превышают по модулю 10^9.
    Как решить данную задачу за время O(N)?

    Добавлено через 37 минут
    есть пока такая попытка, но это далеко не O(N):

    C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    
    #include<stdio.h>
    int main(){
        int A[300001];
        int N;
        int S; 
        S = 0;
        scanf("%dn", &N);
        for(int i=1; i<N; i++){
            scanf("%dn", &A[i]);
        }
        for(int i=1; i<N; i++){
            for(int j=i+1; j!=i; j++){
                if(A[i,j]<=A[i,j+1])
                    S=S+A[i,j];
                else
                    S=S+A[i,j+1];
            }
        }
        printf("%d", S);
    }



    0



    из племени тумба-юбма

    2411 / 1740 / 405

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

    Сообщений: 8,423

    Записей в блоге: 14

    26.11.2020, 22:37

    2

    Что это у вас за индексы такие A[i,j], A[i,j+1]?
    Если массив одномерный, то индекс пишется одной константой(переменной) – A[i], A[i+1]
    Если массив двумерный, тогда пишется двумя, каждый индекс в квадр.скобке – A[i][j], A[i+1][j+1]

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



    1



    3 / 3 / 0

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

    Сообщений: 85

    26.11.2020, 22:37

     [ТС]

    3

    мама Стифлера, так дело в том, что массив нам дан одномерный, но в условии даны 2 индекса. Разве это не значит, что нужно использовать оба?



    0



    из племени тумба-юбма

    2411 / 1740 / 405

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

    Сообщений: 8,423

    Записей в блоге: 14

    26.11.2020, 22:52

    4

    Напишите тогда условие в оригинале.

    Добавлено через 2 минуты
    Сразу дополню, в scanf ничего кроме формата переменной не пишется. В вашем случае должно быть так scanf("%d", &N). Никаких символов перевода строки после формата быть не должно.

    Добавлено через 6 минут

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

    Нужно перебрать все пары чисел A[i] и A[j] в этом массиве

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



    0



    3 / 3 / 0

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

    Сообщений: 85

    26.11.2020, 22:52

     [ТС]

    5

    мама Стифлера, пожалуйста, условие в оригинале

    Миниатюры

    Как найти сумму всех минимумов в массиве?
     



    0



    sodda

    Заблокирован

    26.11.2020, 22:58

    6

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

    Сразу дополню, в scanf ничего кроме формата переменной не пишется. В вашем случае должно быть так scanf(“%d”, &N). Никаких символов перевода строки после формата быть не должно.

    Не правда)
    Пишется, если нужно. Но это, конечно, не тот случай.



    1



    мама Стифлера

    из племени тумба-юбма

    2411 / 1740 / 405

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

    Сообщений: 8,423

    Записей в блоге: 14

    26.11.2020, 23:09

    7

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

    Пишется, если нужно. Но это, конечно, не тот случай.

    согласен
    A_Hatake, вот так у вас должно быть

    C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    #include<stdio.h>
    #include<malloc.h>
     
    int main(void){
        int *A, N, S = 0;
        scanf("%d", &N);
        A = (int*)malloc(N * sizeof(int));
     
        for(int i=0; i<N; i++){
            scanf("%d", &A[i]);
        }
        for(int i=0; i<N-1; i++)
            for(int j=i+1; j<N; j++){
                if(A[i] < A[j])
                    S += A[i];
                else
                    S += A[j];
            }
        printf("%d", S);
        free(A);
    }

    Только в задании ввод-вывод из файлов, я вам сделал ввод-вывод на консоль.



    1



    3 / 3 / 0

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

    Сообщений: 85

    26.11.2020, 23:15

     [ТС]

    8

    мама Стифлера, видимо, не во всех тестах считает правильно, так как на одном из них завалился(



    0



    мама Стифлера

    из племени тумба-юбма

    2411 / 1740 / 405

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

    Сообщений: 8,423

    Записей в блоге: 14

    26.11.2020, 23:20

    9

    A_Hatake, ну тогда я не знаю, что изменить, чтоб везде было правильно Может так:

    Кликните здесь для просмотра всего текста

    C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    int main(void){
        int *A, N, S = 0;
        int i, j;
        scanf("%d", &N);
        A = (int*)malloc(N * sizeof(int));
     
        for(i=0; i<N; i++){
            scanf("%d", &A[i]);
        }
        for(i=0; i<N-1; i++)
            for(j=i+1; j<N; j++){
                if(A[i] < A[j])
                    S += A[i];
                else
                    S += A[j];
            }
        printf("%d", S);
        free(A);
    }



    0



    A_Hatake

    3 / 3 / 0

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

    Сообщений: 85

    26.11.2020, 23:32

     [ТС]

    10

    мама Стифлера, есть еще такая попытка, но она тоже на каком-то тесте валится:

    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
    
    int cmp(const void* a, const void* b)
    {
        return *(int*)a - *(int*)b;
    }
     
    int main(void)
    {
        static int A[300000];
        int N;
     
        scanf("%d", &N);
        for (int i = 0; i < N; i++)
            scanf("%d", &A[i]);
     
        qsort(A, N, sizeof(int), cmp);
     
        long long sum_elements = 0;
        long long s = 0;
        for (int i = 0; i < N; i++)
        {
            s += A[i] * (N - 1 - i);
            if (N==1)
                s = A[i];
            sum_elements += A[i];
        }
     
        printf("%lldn", s);
    }



    0



    из племени тумба-юбма

    2411 / 1740 / 405

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

    Сообщений: 8,423

    Записей в блоге: 14

    26.11.2020, 23:45

    11

    A_Hatake, ну так может все же надо код, который с файлами работает, а не с консолью?



    0



    3 / 3 / 0

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

    Сообщений: 85

    26.11.2020, 23:49

     [ТС]

    12

    мама Стифлера, в этом нет разницы, это точно. Тут дело в коде



    0



    мама Стифлера

    из племени тумба-юбма

    2411 / 1740 / 405

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

    Сообщений: 8,423

    Записей в блоге: 14

    27.11.2020, 00:15

    13

    Может все дело в в переменной S, а если так:

    Кликните здесь для просмотра всего текста

    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
    
    #include<stdio.h>
    #include<malloc.h>
     
    int main(void){
        int *A, N;
        long long S = 0;
        scanf("%d", &N);
        A = (int*)malloc(N * sizeof(int));
     
        for(int i=0; i<N; i++){
            scanf("%d", &A[i]);
        }
        for(int i=0; i<N-1; i++){
            for(int j=i+1; j<N; j++){
                if(A[i] < A[j])
                    S += A[i];
                else
                    S += A[j];
            }
        }
        printf("%lld", S);
        free(A);
        return 0;
    }



    0



    296 / 227 / 102

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

    Сообщений: 780

    27.11.2020, 15:16

    14

    Вообще, в задаче указана работа с файлами input.txt и output.txt



    0



    из племени тумба-юбма

    2411 / 1740 / 405

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

    Сообщений: 8,423

    Записей в блоге: 14

    27.11.2020, 15:54

    15

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

    Вообще, в задаче указана работа с файлами input.txt и output.txt

    ТС уже ответил, что без разницы

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

    A_Hatake, ну так может все же надо код, который с файлами работает, а не с консолью?

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

    мама Стифлера, в этом нет разницы, это точно. Тут дело в коде



    0



    D3m1an

    296 / 227 / 102

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

    Сообщений: 780

    27.11.2020, 18:48

    16

    Лучший ответ Сообщение было отмечено A_Hatake как решение

    Решение

    мама Стифлера, если проверяет код другая программа, то разница имеется. Результата она не найдет , ибо результирующий файл не будет создан.

    Вот можно попробовать. Если я нигде не ошибся

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define FN_INPUT            "input.txt"
    #define FN_OUTPUT           "output.txt"
    #define ERR_FOPEN           -1
    #define ERR_FREAD           -2
    #define ERR_FWRITE          -3
    #define ERR_MEM             -4
    #define ERR_ARG             -5
     
    int main()
    {
        FILE * fin, * fout; 
        
        fin = fopen(FN_INPUT, "r");
        if(fin == NULL)
            exit(ERR_FOPEN);
        
        fseek(fin, 0, SEEK_END);
        long fSize = ftell(fin);
        rewind(fin);
        
        char * buff = malloc(sizeof(char) * fSize);
        if(buff == NULL)
        {
            fclose(fin);
            exit(ERR_MEM);
        }
        int result = fread(buff, sizeof(char), fSize, fin);
        if(result != fSize)
        {
            fclose(fin);
            free(buff);
            exit(ERR_FREAD);
        }
        fclose(fin);
        
        unsigned n = strtoll(buff, NULL, 10);
        long long * a;
        if(n)
        {
            a = malloc(sizeof(long long) * n);
            if(a == NULL)   exit(ERR_MEM);
            else            memset(a, 0, n);
        }
        else
        {
            free(buff);
            exit(ERR_ARG);
        }
        
        for(int i = 0; i < n; i++)
            a[i] = strtoll(&buff[(i + 1) * 2], NULL, 10);
        free(buff);
        
        long long sum = 0;
        for(int i = 0; i < n-1; i++)
            for(int j = i+1; j < n; j++)
                sum += (a[i] < a[j]) ? a[i]: a[j];
            
        fout = fopen(FN_OUTPUT, "w");
        if(fout == NULL)
        {
            free(a);
            exit(ERR_FOPEN);
        }
        result = fprintf(fout, "%lld", sum);
        if(result == 0)
        {
            fclose(fout);
            exit(ERR_FWRITE);
        }
        
        fclose(fout);
        return 0;
    }

    Добавлено через 4 минуты
    Ой, забыл, что числа могут быть состоять не из одной цифры. ))
    Не будет прога работать с числами больше 9. Чуть позже допишу.

    Добавлено через 2 часа 40 минут

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define FN_INPUT            "input.txt"
    #define FN_OUTPUT           "output.txt"
    #define ERR_FOPEN           -1
    #define ERR_FREAD           -2
    #define ERR_FWRITE          -3
    #define ERR_MEM             -4
    #define ERR_ARG             -5
     
    long long getNumberFromFile(FILE * f)
    {
        long long n = 0LL;
        int c;
        while((c = fgetc(f)) != EOF)
            if(c > '0' && c < '9')
                n = n * 10 + c - '0';
            else if(n > 0 && (c < '0' || c > '9'))
                break;
        return n;
    }
     
    int main()
    {
        FILE * fin, * fout; 
        
        fin = fopen(FN_INPUT, "r");
        if(fin == NULL)
            exit(ERR_FOPEN);
        
        unsigned n = getNumberFromFile(fin);
        long long * a;
        if(n)
        {
            a = malloc(sizeof(long long) * n);
            if(a == NULL)   exit(ERR_MEM);
            else            memset(a, 0, n);
        }
        else
            exit(ERR_ARG);
        
        for(int i = 0; i < n; i++)
            a[i] = getNumberFromFile(fin);
        fclose(fin);
        
        long long sum = 0;
        for(int i = 0; i < n-1; i++)
            for(int j = i+1; j < n; j++)
                sum += (a[i] < a[j]) ? a[i]: a[j];
        
        fout = fopen(FN_OUTPUT, "w");
        if(fout == NULL)
        {
            free(a);
            exit(ERR_FOPEN);
        }
        
        if(fprintf(fout, "%lld", sum) == 0)
        {
            fclose(fout);
            exit(ERR_FWRITE);
        }
        fclose(fout);
        return 0;
    }

    Исправил



    2



    Данная тема основывается на теме: Массивы. Одномерные массивы. Инициализация массива


    Содержание

    • 1. Нахождение сумм и произведений элементов массива. Примеры
    • 2. Нахождение максимального (минимального) элемента массива. Примеры
    • 3. Сортировка массива методом вставки
    • 4. Поиск элемента в массиве. Примеры
    • Связанные темы

    Поиск на других ресурсах:

    1. Нахождение сумм и произведений элементов массива. Примеры

    Пример 1. Задан массив A, содержащий 100 целых чисел. Найти сумму элементов этого массива. Фрагмент кода, решающего эту задачу

    // сумма элементов массива A из 100 целых чисел
    int A[100];
    int suma; // переменная, содержащая сумму
    int i;    // дополнительная переменная
    
    // ввод массива A
    // ...
    
    // Вычисление суммы
    suma = 0; // обнулить сумму
    for (i=0; i<100; i++)
        suma += A[i];

    Перебор всех элементов массива выполняется в цикле for.

    Переменная sum сохраняет результирующее значение суммы элементов массива. Переменная i есть счетчиком, определяющим индекс элемента массива A[i].



    Пример 2. Задан массив B, содержащий 20 вещественных чисел. Найти сумму элементов массива, которые лежат на парных позициях. Считать, что позиции 0, 2, 4 и т.д. есть парными.

    // сумма элементов массива B
    // лежащих на парных позициях
    float B[20];
    float sum; // переменная, содержащая сумму
    int i; // дополнительная переменная
    
    // ввод массива
    // ...
    
    // Вычисление суммы
    sum = 0; // обнулить сумму
    for (i=0; i<20; i++)
        if ((i%2)==0)
            sum += B[i];

    В этом примере выражение

    (i%2)==0

    определяет парную позицию (парный индекс) массива B. Если нужно взять нечетные позиции, то нужно написать

    (i%2)==1

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

    // сумма положительных элементов массива
    int A[50];
    int sum; // переменная, содержащая сумму
    int i; // дополнительная переменная
    
    // ввод массива
    // ...
    
    // Вычисление суммы
    sum = 0; // обнулить сумму
    for (i=0; i<50; i++)
        if (A[i]>0)
            sum = sum + A[i];

    Пример 4. Задан массив из 50 целых чисел. Найти произведение элементов массива, которые есть нечетными числами.

    // произведение нечетных элементов массива
    int A[50];
    int d; // переменная, содержащая произведение
    int i; // вспомогательная переменная
    
    // ввод массива
    // ...
    
    // Вычисление произведения
    d = 1; // начальная установка переменной d
    for (i=0; i<50; i++)
        if ((A[i]%2)==1)
            d = d * A[i];

    Чтобы определить, есть ли элемент массива A[i] нечетным, нужно проверить условие

    (A[i]%2)==1

    Если условие выполняется, то элемент массива есть нечетное число.

    2. Нахождение максимального (минимального) элемента массива. Примеры

    Пример 1. Задан массив из 30 вещественных чисел. Найти элемент (индекс), имеющий максимальное значение в массиве.

    // поиск позиции (индекса), содержащего максимальное значение
    float B[30];
    float max; // переменная, содержащая максимум
    int index; // позиция элемента, содержащего максимальное значение
    int i; // дополнительная переменная
    
    // ввод массива
    // ...
    
    // поиск максимума
    // установить максимум как 1-й элемент массива
    index = 0;
    max = B[0]; 
    for (i=1; i<30; i++)
        if (max<B[i]) 
        { 
            max = B[i]; // запомнить максимум
            index = i;  // запомнить позицию максимального элемента
        }

    В вышеприведенном примере переменная max содержит максимальное значение. Переменная index содержит позицию элемента, который имеет максимальное значение. В начале переменной max присваивается значение первого элемента массива. Затем, начиная со второго элемента, происходит прохождение всего массива в цикле for. Одновременно проверяется условие

    if (max<B[i])

    Если условие выполняется (найден другой максимум), тогда новое значение максимума фиксируется в переменных max и index.

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

    Пример 2. Задан массив содержащий 50 целых чисел. Найти позицию (позиции) элемента, который имеет минимальное значение. Если таких элементов несколько, сформировать дополнительный массив индексов.

    // поиск позиций (индексов), содержащих минимальное значение
    int A[50];
    int min; // переменная, содержащая минимальное значение
    int INDEXES[50]; // позиции элементов, содержащих минимальное значение
    int n; // число одинаковых минимальных значений
    int i; // дополнительная переменная
    
    
    // ввод массива
    // ...
    
    // 1. Поиск минимального значения
    // установить минимальное значение в первом элементе массива
    min = A[0];
    for (i=1; i<50; i++)
        if (min>A[i])
            min = A[i]; // запомнить минимальное значение
    
    // 2. Формирование массива
    n = 0; // обнулить счетчик в массиве INDEXES
    for (i=0; i<50; i++)
        if (min == A[i])
            {
                n++; // увеличить число элементов в INDEXES
                INDEXES[n-1] = i; // запомнить позицию
            }
    
    listBox1->Items->Clear();
    
    // 3. Вывод массива INDEXES в listBox1
    for (i=0; i<n; i++)     
        listBox1->Items->Add(INDEXES[i].ToString());

    В вышеприведенном листинге сначала ищется минимальное значение min.

    На втором шаге формируется массив INDEXES, в котором число элементов записывается в переменную n. Происходит поиск минимального значения в массиве A с одновременным формированием массива INDEXES.

    На третьем шаге приведен пример, как вывести массив INDEXES в элементе управления listBox1(ListBox).

    3. Сортировка массива методом вставки

    Пример. Пусть дан массив A, содержащий 10 целых чисел. Отсортировать элементы массива в нисходящем порядке с помощью метода вставки.

    // сортировка массива методом вставки
    int A[10];
    int i, j; // дополнительные переменные - счетчики
    int t; // дополнительная переменная
    
    // ввод массива A
    // ...
    
    // сортировка
    for (i=0; i<9; i++)
        for (j=i; j>=0; j--)
            if (A[j]<A[j+1])
            {
                // поменять местами A[j] и A[j+1]
                t = A[j];
                A[j] = A[j+1];
                A[j+1] = t;
            }

    4.  Поиск элемента в массиве. Примеры

    Пример 1. Определить, находится ли число k в массиве M состоящем из 50 целых чисел.

    // определение наличия заданного числа в массиве чисел
    int M[50];
    int i;
    int k; // искомое значение
    bool f_is; // результат поиска, true - число k есть в массиве, иначе false
    
    // ввод массива M
    // ...
    // ввод числа k
    // ...
    
    // поиск числа в массиве
    f_is = false;
    for (i=0; i<50; i++)
        if (k==M[i])
        {
            f_is = true; // число найдено
            break; // выход из цикла, дальнейший поиск не имеет смысла
        }
    
    // вывод результата
    if (f_is)
        label1->Text = "Число " + k.ToString() + " есть в массиве M.";
    else
        label1->Text = "Числа " + k.ToString() + " нет в массиве M.";

    Пример 2. Найти все позиции вхождения числа k в массиве M состоящим из 50 целых чисел.

    // определение всех позиций заданного числа в массиве чисел
    int M[50]; // массив чисел
    int i; // вспомогательная переменная
    int k; // искомое значение
    int INDEXES[50]; // искомый массив позиций вхождения числа k
    int n; // количество найденных позиций или количество элементов в массиве INDEXES
    
    // ввод массива M
    // ...
    // ввод числа k
    // ...
    
    // поиск числа k в массиве M и одновременное формирование массива INDEXES
    n = 0;
    for (i=0; i<50; i++)
        if (k==M[i])
        {
            // число найдено
            n++;
            INDEXES[n-1] = i;
        }
    
    // вывод результата в listBox1
    listBox1->Items->Clear();
    
    for (i=0; i<n; i++)
        listBox1->Items->Add(INDEXES[i].ToString());


    Связанные темы

    • Массивы. Часть 1. Определение массива в C++. Одномерные массивы. Инициализация массива
    • Массивы. Часть 2. Двумерные массивы. Массивы строк. Многомерные массивы


    Маша Ткаченко



    Ученик

    (91),
    на голосовании



    12 лет назад

    Надо задачу решить на паскале! одномерный масив”!

    Голосование за лучший ответ

    Адриан Сивак

    Профи

    (680)


    12 лет назад

    const n=10;
    var a: array [1..n] of integer;
    i,j,k,s:integer;
    begin
    writeln(‘ Vvedite elementi massiva’);
    for i:=1 to n do
    begin
    write(i,’-i element’);
    readln(a);
    end;
    for i:=1 to n do
    for j:=i+1 to n do
    if a>a[j] then begin
    k:= a; a:= a[j]; a[j]:=k; end;
    s:=a[n]+a[n-1]+ a[i-2];
    writeln(‘ summa ravna’, s);
    readln;
    end.

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