C/C++

[C++] Помогите написать код!

Дан массив из N натуральных чисел a1,...,aN. Исключить из массива повторяющиеся элементы.
Решить не используя дополнительного массива.
Мне кажется, это возможно решить и без векторов, но попрошу вас придерживаться лишь использования <iostream> в решении.
Вадим Егоров
Вадим Егоров
1 435
int main()
{
srand(time(0));
setlocale(LC_ALL, "rus");
int a[20],flag;
for (int i = 0; i < 20; i++) {
a[i] = rand() % 20;
printf("%4d", a[i]);
}
printf("\n");
for (int i = 0; i < 20; i++) {
flag = 1;
for (int j = 0; j < 20; j++)
{
if (i - j != 0 && a[i] == a[j])
flag = 0;
}
if (flag) printf("%4d", a[i]);
}

return 0;

}
Александр Арбузов
Александр Арбузов
346
Лучший ответ
#include < iostream >
using namespace std;

void sdvig(unsigned int* array, int size, int sdvig)
{
for (int i = sdvig; i < size-1; i++)
array[i] = array[i + 1];
}

int main()
{
int size;
int delta = 0; //уменьшение массива на кол-во совпадающих чисел
cout << "Enter size: ";
cin >> size;
unsigned int* array;
array = (unsigned int*)malloc(sizeof (unsigned int) * size); //создаем массив
if (!array) return 1;
for (int i = 0; i < size; i++)
array[i] = rand() % 17;

for (int i = 0; i < size; i++) // печать исходного массива
cout << array[i] << " ";
cout << endl;

for (int i = 0; i < size - 1 - delta; i++) //поиск совпадающих чисел
for (int j = i+1; j < size - delta ; j++)
{
if (array[i] == array[j]) {sdvig(array, size, j); delta++; j--;} //если есть совпадающие числа - сдвинуть
}

unsigned int* check = (unsigned int*)realloc(array, sizeof(unsigned int) * (size - delta)); //освобождаем лишнюю память delta
if (check) array = check; else return 1;

for (int i = 0; i < size - delta; i++) // печать итога
cout << array[i] << " ";

free(array); //удаляем массив

}