C/C++

Простая задачка на c++

Даны целые числа а1, а2...а15 (могут быть повторяющиеся члены).
Получить все числа, которые входят в последовательность по одному разу.
Вот что получилось у меня, поможете поправить?


#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL,"Rus");
const int n=15;
int b=0;
int A[n];
cout<<"Введите 15 элементов"<<endl;
for (int i=0; i<n; i++)
{
cin>>A[i];
}
for (int i=0;i<n;i++)
{
b=0;
for (int k=0; k<n;k++)
{
if (A[i]==A[k])
{
b=1;
}
}
if (b==0)
{
cout<<A[i]<<endl;
}
}


system("pause>0");
}
   Не хотелось бы навязываться, но не проще ли сначала сгруппировать (это более вольный аналог сортировки), потом просто пройти по массиву и отобрать уникальные элементы?

   Заранее приношу все извинения, если вдруг STL использовать нельзя. Будь я разработчиком, то использовал бы контейнер map <int, bool> — это очень удобно.
   При первом помещении в такой массив нового элемента присвоил бы ему значение true. При всех повторных ничего не добавлял бы, а присвоил бы существвющему элементу значение false.
   По окончании ввода оставалось бы выбрать из массива элементы со значением true.
Дамир Шингарев
Дамир Шингарев
16 172
Лучший ответ
Дамир Шингарев Конечно, можно обойтись и без map. Тогда объявляется тип struct { int, bool } и массив из элементов этого типа. Однако, при вводе каждого из элементов массива придётся выполнять процедуру поиска похожего элемента.
Ignis Inferno Да, я тоже хотел предложить использовать true или false, но это будет трудно. Запнулся на проверках
#include
#include
using namespace std;
int main()
{
setlocale(LC_ALL, "Rus");

cout << endl;
int chet = 0;
int size = 5;
int* arr = new int[size];
for (int i = 0; i < size; i++)
{
cin >> arr[i];
}
vector myvector(size);
bool znak = false;
for (int i = 0; i < size; i++)
{

for (int j = 0; j < size; j++)
{
if (i != j && arr[i] == arr[j])
{
znak = true;
break;
}
}
if (znak == false)
{
myvector[chet] = arr[i];
cout << myvector[i] << ' ';
chet++;
}

}

for (int i = 0; i < size; i++)
{
cout << myvector[i] << " ";
}

delete[] arr;
return 0;
}
Дамир Шингарев Есть ещё мысль, использовать функцию memmove для ускорения перегруппировки: если очередное введённое число совпало с введённым ранее, то прежде вычисляем указатель на место после соответствующего элемента и функцией memmove подвигаем часть массива вперёд, освободив в промежутке одну ячейку для нового элемента. Таким образом, совпадающие элементы будут следовать группами.

Замечание: искать совпадение следует в обратном направлении!!!
#include <iostream>
#include <set>
using namespace std;
int main() {
auto n = 15;
set<int> box;
int m;
cout << ">>> ";
do {
cin >> m;
box.insert(m);
} while (--n);
cout << "<<< ";
for (auto x : box) cout << x << ' ';
puts("");
system("pause > nul");
}
Ignis Inferno вау, такое маленькое решение
Сергей Андреев Похоже, что автор вопроса в первую очередь ожидал технологического обсуждения задачи.
Сергей Андреев Николай, может быть Вы хотели использовать не set, а multiset?
Задача вовсе не требует выбирать каждый элемент по одному разу. Это задача выбора уникальных элементов.
#include<stdio.h>
#include<wchar.h>
#include<locale.h>
#include<unistd.h>
int main()
{
setlocale(LC_ALL,"Russian");
const int n=15;
int b;
int A[n];
wprintf(L"Введите %d элементов: \n",n);
for (int i = 0; i < n; i++)
{//for i
wprintf(L"A[%d] = ",i);
scanf("%d",&A[i]);
}//for i

for (int i = 0; i < n; i++)
{//for i
b=0;
for (int k = 0; k < n; k++)
{//for k
if ((A[i] == A[k]) && (i != k))
b++;
}//for k
if(!b) wprintf(L"уникальный элемент массива: %d \n",A[i]);
}//for i

fflush(stdout);//сброс буфера для паузы
sleep(5);//пауза
return 0;
}
Izzat Я
Izzat Я
37 945
Вот код, но где-то в if у него проблемы. Может быть и исправишь
Код:
#include
#include
using namespace std;
int main()
{
setlocale(LC_ALL, "Rus");

cout << endl;
int chet = 0;
int size = 5;
int* arr = new int[size];
for (int i = 0; i < size; i++)
{
cin >> arr[i];
}
vector myvector(size);
bool znak = false;
for (int i = 0; i < size; i++)
{

for (int j = 0; j < size; j++)
{
if (i != j && arr[i] == arr[j])
{
znak = true;
break;
}
}
if (znak == false)
{
myvector[chet] = arr[i];
cout << myvector[i] << ' ';
chet++;
}

}

for (int i = 0; i < size; i++)
{
cout << myvector[i] << " ";
}

delete[] arr;
return 0;
}
Дамир Шингарев Может быть проще на первом шаге перегруппировать элементы массива так, чтобы одинаковые шли рядом. Тогда на втором шаге будет проще выбрать уникальные.

Только прежде следует проверять неуникальность: если следующий элемент совпадает с текущим, то в цикле пропустить все такие же элементы и вернуться назад. А вот если следующий элемент сразу не совпал с текущим, то выбрать текущий как уникальный.
Дамир Шингарев Не понимаю, нужен ли динамический массив? Ведь число элементов однозначно задано условиями задания!