0 / 0 / 1
Регистрация: 04.05.2014
Сообщений: 66
1

Поиск одинаковых чисел в трех массивах

08.04.2016, 18:11. Показов 2278. Ответов 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <conio.h>
#include<stdlib.h>
#include <ctime>
 
using namespace std;
 
void main()
{
    srand(time(0));
    setlocale(LC_ALL, "Russian");
    
    const int n = 5;
    int A[n], B[n], C[n], i, j, k=0, D[n];
 
    for (i = 0; i < n; i++)
    {
        A[i] = -5+rand()%(5-(-5)+1);
        B[i] = -5+rand()%(5-(-5)+1);
        C[i] = -5+rand()%(5-(-5)+1);
    }
    for (i = 0; i < n; i++)
        cout << A[i] << '\t';
    
    cout << endl;
    for (i = 0; i < n; i++)
        cout << B[i] << '\t';
    
    cout << endl;
    for (i = 0; i < n; i++)
        cout << C[i] << '\t';
 
    for (i = 0; i < n; i++)
        for(j = 0; j < n; j++)
            if (A[i]==B[j])
            {
                D[k]=A[i];
                k++;
                break;
            }
    cout << endl;
    for (i = 0; i < k; i++)
        cout << D[i] << '\t';
    _getch();
}
и в случае нахождения в первом массиве одинаковых элементов в четвертый массив этот элемент записывается два раза соответственно. Как этого избежать, или может быть есть какой-либо другой способ(без всяких изысков, типа vector) нахождения одинаковых чисел в трех массивах с последующем их выводом на экран..? Заранее спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2016, 18:11
Ответы с готовыми решениями:

Поиск одинаковых элементов в массивах!
Даны 2 массива(x,y) cоставить новый массив (z), из тех элементов массива (x) которые не входят в...

Поиск одинаковых элементов в 2 массивах
Всем привет) Как можно организовать поиск одинаковых элементов в 2 массивах? (сам цикл...

Вывести количество одинаковых из введенных трех чисел
Ввести с клавиатуры 3 числа. Вывести количество одинаковых из них.

Проверить есть ли среди трех чисел хотя бы два одинаковых
1.Дано три натуральних числа. З’ясувати, чи є серед них хоча б два однакових Даны 3 натуральных...

10
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
08.04.2016, 18:34 2
Сначала избавься от повторов в первом массиве. Затем проходи по нему и ищи элемент во всех остальных.
0
0 / 0 / 1
Регистрация: 04.05.2014
Сообщений: 66
08.04.2016, 18:43  [ТС] 3
Цитата Сообщение от nmcf Посмотреть сообщение
Сначала избавься от повторов в первом массиве. Затем проходи по нему и ищи элемент во всех остальных.
А если после данной проверки нужно продолжать пользоваться исходными массивами? Получается, что придется создавать слишком много новых массивов, может все таки есть какой-то другой более рациональный способ?
0
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
08.04.2016, 19:05 4
Ну пользуйся. Я не говорил, что их нужно изменять. Создай параллельно первому массиву булевский и повторяющиеся элементы отметь false, при поиске пропускай их.
0
Вездепух
Эксперт CЭксперт С++
10312 / 5602 / 1530
Регистрация: 18.10.2014
Сообщений: 13,675
08.04.2016, 19:06 5
Цитата Сообщение от Nordener Посмотреть сообщение
А если после данной проверки нужно продолжать пользоваться исходными массивами?
Если в задаче разрешается переиспользовать (то есть модифицировать) исходные массивы, то разумнее просто отсортировать все три массива, а затем за один проход одновременно выполнить операцию пересечения трех множеств, которая и даст ответ на исходный вопрос.

Если же исходные массивы модифицировать не разрешается, то проще скопировать все три и рпботать этим же способом.
0
0 / 0 / 1
Регистрация: 04.05.2014
Сообщений: 66
08.04.2016, 19:54  [ТС] 6
Может все таки есть более простой способ нахождения одинаковых элементов в трех массивах? Можно отвечать с кодом пожалуйста, а то так не совсем понятно..

Добавлено через 20 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
операцию пересечения трех множеств
Сижу и никак не пойму как это реализовать на c++, можно пример?

Добавлено через 19 минут
Не уже ли никто не может просто написать решение вопроса? "Поиск одинаковых чисел в трех массивах с последующим их выводом?"
0
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
08.04.2016, 19:58 7
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
bool fA[n], fB[n], fC[n];
 
for (i = 0; i < n; i++)
{
    fA[i] = true;
    fB[i] = true;
    fC[i] = true;
}
 
    for (i = 0; i < n; i++)
        for(j = i + 1; j < n; j++)
        {
            if (fA[i] && A[i] == A[j]) fA[j] = false;
            if (fB[i] && B[i] == B[j]) fB[j] = false;
            if (fC[i] && C[i] == C[j]) fC[j] = false;
        }
 
    int c = 0;
 
    for (i = 0; i < n; i++)
        for(j = 0; j < n; j++)
        {
            if (fA[i] && fB[j] && A[i] == B[j])
                for(k = 0; k < n; k++)
                    if (fC[k] && A[i] == C[k]) D[c++] = A[i];
        }
1
0 / 0 / 1
Регистрация: 04.05.2014
Сообщений: 66
08.04.2016, 20:35  [ТС] 8
nmcf, спасибо конечно, работать-то оно работает, но как - совершенно не понятно для меня, а для меня важно понимать как работает, а не просто копировать...
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
#include <iostream>
#include <conio.h>
#include<stdlib.h>
#include <ctime>
 
using namespace std;
 
void main()
{
    srand(time(0));
    setlocale(LC_ALL, "Russian");
    
    const int n = 10;
    int A[n], B[n], C[n], i, j, k=0, D[n], E[n], p=0;
 
    for (i = 0; i < n; i++)
    {
        A[i] = -5+rand()%(5-(-5)+1);
        B[i] = -5+rand()%(5-(-5)+1);
        C[i] = -5+rand()%(5-(-5)+1);
    }
    for (i = 0; i < n; i++)
        cout << A[i] << '\t';
    
    cout << endl;
    for (i = 0; i < n; i++)
        cout << B[i] << '\t';
 
    cout << endl;
    for (i = 0; i < n; i++)
        cout << C[i] << '\t';
 
    bool fA[n], fB[n], fC[n];
 
    for (i = 0; i < n; i++)
    {
        fA[i] = true;
        fB[i] = true;
        fC[i] = true;
    }
 
    for (i = 0; i < n; i++)
        for(j = i + 1; j < n; j++)
        {
            if (fA[i] && A[i] == A[j]) fA[j] = false;
            if (fB[i] && B[i] == B[j]) fB[j] = false;
            if (fC[i] && C[i] == C[j]) fC[j] = false;
        }
 
    int c = 0;
 
    for (i = 0; i < n; i++)
        for(j = 0; j < n; j++)
        {
            if (fA[i] && fB[j] && A[i] == B[j])
                for(k = 0; k < n; k++)
                    if (fC[k] && A[i] == C[k]) D[c++] = A[i];
        }
        
    cout << endl;
    for (i = 0; i < c; i++)
        cout << D[i] << '\t';
    _getch();
}
0
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
08.04.2016, 20:48 9
Ну так вникай. Что тут сложного? Простой перебор.
0
0 / 0 / 1
Регистрация: 04.05.2014
Сообщений: 66
08.04.2016, 20:58  [ТС] 10
nmcf, ну да посидел немного, по шагам по выполнял, понял вроде бы... Но я сам бы до этого решения никогда бы не дошел, обидно...
0
68 / 68 / 37
Регистрация: 26.10.2013
Сообщений: 198
08.04.2016, 23:43 11
Nordener, можно попробовать следующий код:
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
        int max = A[0]; 
    int min = A[0];
    for(i = 0; i < n; i++) {
        if(A[i] > max) max = A[i];
        if(B[i] > max) max = B[i];
        if(C[i] > max) max = C[i];
 
        if(A[i] < min) min = A[i];
        if(B[i] < min) min = B[i];
        if(C[i] < min) min = C[i];
    }
 
    int len = max - min + 1;
    int* D = new int[len];
    for(i = 0; i < len; i++) D[i] = 0;
 
    for(i = 0; i < n; i++) D[A[i] - min] = 1;
    for(i = 0; i < n; i++) if(D[B[i] - min]) D[B[i] - min] = 2;
    for(i = 0; i < n; i++) if(D[C[i] - min] == 2) D[C[i] - min] = 3;
 
    bool rez = false;
    cout<<"Одинаковые элементы: ";
    for(i = 0; i < len; i++){
        if(D[i] == 3) {
            rez = true;
            cout<<i + min<<" ";
        }
    }
    if(!rez) cout<<"Нет совпадений";
    cout<<endl;
Код прост, но стоит его использовать только если точно известно, что разброс значений в массивах не будет громадным. Иначе его использование будет неоправданным.

P.S. Если уже изучали STL, то через map все будет значительно проще и нет такого ограничения как для моего варианта.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2016, 23:43
Помогаю со студенческими работами здесь

Поиск 2-х и более одинаковых чисел в массиве
Программа должна находить в массиве значения, встречающиеся 2 и более раз. Проблема в том, что...

Поиск минимального, среднее и максимального чисел из трех введенных
Помогите плиз, у пользователя запрашивают 3 числа и программа ищет среди них минимальное, среднее и...

Если сумма трех попарно различных действительных чисел меньше 100, то наименьшее из этих трех чисел заменить полусуммой
2)Если сумма трех попарно различных действительных чисел x,y,z меньше 100, то наименьшее из этих...

Посчитать количество одинаковых элементов в двух массивах
#include &lt;cstdio&gt; #include &lt;map&gt; #include &lt;iostream&gt; using namespace std; map &lt;bool, int&gt; a;...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru