Как сравнить элемент массива в c / c ++? - PullRequest
0 голосов
/ 04 апреля 2020
int arr[] = {10, 20, 20, 10, 10, 30, 50, 10, 20};

Я хочу сравнить каждый элемент в массиве, чтобы можно было создавать пары одинаковых чисел, используя C / C ++.

В приведенном выше примере есть три пары (10-10, 20-20, 10-10). Я хочу найти количество пар в данном массиве (то есть 3).

Может кто-нибудь помочь мне с логи c?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Подход с использованием C может отличаться от подхода с использованием C ++, поскольку, например, в C ++ вы можете использовать стандартные контейнеры и алгоритмы, тогда как в C они отсутствуют.

Поэтому я покажу решение, которое может быть реализован на обоих языках.

Вот, пожалуйста. Программа написана с использованием C, но ее легко преобразовать в программу на C ++, подставив заголовок и один оператор: оператор вывода.

#include <stdio.h>

int main( void )  
{ 
    int a[] = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };
    const size_t N = sizeof( a ) / sizeof( *a ); 
    size_t total = 0; 

    for ( size_t i = 1; i < N; i++ ) 
    { 
        size_t count = 1; 
        for ( size_t j = 0; j < i; j++ ) 
        { 
            if ( a[i] == a[j] ) ++count; 
        } 

        if ( count % 2 == 0 ) ++total; 
    } 

    printf( "The number of pairs of equal elements is %zu\n", total );

    return 0; 
}

Вывод программы:

The number of pairs of equal elements is 3

В C ++ вы можете использовать, например, следующий альтернативный подход с использованием стандартного контейнера std::map или std::unordered_map.

#include <iostream> 
#include <map> 

int main()  
{ 
    int a[] = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };
    size_t total = 0; 

    std::map<int, size_t> m; 

    for ( const auto &item : a ) ++m[item]; 

    for ( const auto &item : m ) total += item.second / 2; 

    std::cout << "The number of pairs of equal elements is " << total << '\n'; 

    return 0; 
}

Вывод программы такой же, как показано выше.

The number of pairs of equal elements is 3
1 голос
/ 04 апреля 2020

А вот решение C ++.

Тот же подход, что и у Влада. Просто посчитайте группы всех значений и разделите этот счетчик на 2, потому что мы ищем пары.

Затем подсчитаем общее количество:

#include <iostream>
#include <map>
#include <algorithm>
#include <numeric>


int main() {
    // The data
    int arr[] = { 10, 20, 20, 10, 10, 30, 50, 10, 20 };

    // The counter for occurences of one value in the array
    std::map<int, size_t> counter{};

    // Do Count
    for (int i : arr) counter[i]++;

    // Devide all counts by 2. Thats, because we are looking for pairs
    std::for_each(counter.begin(), counter.end(), [](auto& p) { p.second /= 2;});

    // Calculate the overall sum
    size_t pairCounter = std::accumulate(counter.begin(), counter.end(), 0U,
        [](const size_t v, const auto& p) { return v + p.second; });

    std::cout << "\nNumber of pairs: " << pairCounter << "\n";

    return 0;
}
...