Найти в массиве последовательности из идущих подряд трех равных между собой элементов, и удалить два из них - C (СИ)
Формулировка задачи:
Задача: Дан массив а1,...,а50. Найти в нем последовательности из идущие подряд трех равных между собой элементов, и удалить два из них. Если таких нет напечатать 0.
Подскажите хотя бы на словах, что за чем делать. Заранее благодарен.
Решение задачи: «Найти в массиве последовательности из идущих подряд трех равных между собой элементов, и удалить два из них»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int n=0;//Вводим количество элементов
printf("Write size of array:\n");
scanf("%d", &n);
int *a = (int *)calloc(n, sizeof(int));//Вводим элементы масива
printf("Write elements of array:\n");
for(int i=0;i<n;i++)
scanf("%d", &a[i]);
int t = a[0], s = 1, w = 1;//в t - имеем текушее значение, s - количествораз которое t встречалось без перерыва, w - флаг того что небыло обнаруженно последовательностей длины 3
for(int i=1;i<n;i++){ // со второго элемента проверяем
if(a[i] == t) // если a[i] == t то увеличиваем значение s
s++;
else{// устанавливаем новое значение t=a[i] и то количество раз которое оно встречалось s = 1
t = a[i];
s = 1;
}
if(s == 3){//если текущее значение t встретилось в s=3ий раз, то
for(int j=i-1, k = i+1;k<n;j++, k++) // сдвигаем элементы масива
a[j] = a[k]; //j - второй повторяющийся элемент, k - следующий элемент за третим повторяющимся элементом
a = (int *)realloc(a, (n-2)*sizeof(int)); // изменяем раззмер на 2
n-=2;i-=2;t = a[i];s = 1;// устанавливаем соот значения
w = 0; // ставим флаг того что изменение произошло, те не 0 не будет выведен 0
}
}
if(w==1){// если изменения не было выводим 0
printf("Result is:\n");
printf("0\n");
}else{// иначе выводим изменённый масив
printf("Result is:\n");
for(int i=0;i<n;i++)
printf("%d ", a[i]);
printf("\n");
}
return 0;
}
Объяснение кода листинга программы
- Программа запрашивает у пользователя размер массива и сохраняет его в переменной
n. - Программа выделяет память под массив
aс помощью функцииcallocи сохраняет указатель на начало массива в переменнойa. - Программа запрашивает у пользователя значения для заполнения массива
aи сохраняет их в соответствующую память. - Программа инициализирует переменные
t,sиwзначениями, необходимыми для поиска последовательности из трех одинаковых элементов. - Программа начинает цикл, который проходит по всем элементам массива, начиная со второго, и проверяет, является ли текущий элемент равным
t. - Если текущий элемент равен
t, программа увеличивает значениеsна единицу. - Если текущий элемент не равен
t, программа устанавливает новое значениеtи сбрасывает значениеsна единицу. - Если значение
sравно 3, программа начинает цикл, который сдвигает элементы массива, начиная с третьего повторяющегося элемента, и изменяет размер массива на два элемента меньше. - После завершения цикла программа проверяет значение переменной
w. Если оно равно 1, программа выводит сообщение0, что означает, что в массиве не было найдено последовательности из трех одинаковых элементов. - Если значение переменной
wне равно 1, программа выводит измененный массив.