Найти общее количество элементов в постоянных участках последовательности - C (СИ)
Формулировка задачи:
Постоянным участком называется участок, состоящий по крайней мере из двух идущих подряд равных чисел.
Пример: 3 2 5 5 6 7 1 2 1 1 1 1 5 6 9 2 2 Ответом будет 8.
Пусть я сравниваю числа и нахожу кол-во равных друг другу чисел. То есть 5 на выше указанном примере. А что делать дальше я не совсем понимаю ? Последовательность считывается с файла, и все это нужно сделать за один проход по файлу, то есть за один цикл.
Решение задачи: «Найти общее количество элементов в постоянных участках последовательности»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
unsigned GetLengthConstRegions(FILE* stream)
{
unsigned length = 0;
int region = 0, equals = 0;
int numbPrev, numbNext;
if (fscanf(stream, "%d", &numbPrev) == 1)
{
while (fscanf(stream, "%d", &numbNext) == 1)
{
equals = (numbPrev == numbNext);
length += (equals || region);
region = equals;
numbPrev = numbNext;
}
length += region;
}
return length;
}
int main(int argc, char* argv[])
{
FILE* f = stdin;
if ((argc > 1) && (f = fopen(argv[1], "r")) == NULL)
{
perror(argv[1]);
f = stdin;
}
printf("%u\n", GetLengthConstRegions(f));
return 0;
}
Объяснение кода листинга программы
В этом коде реализована функция GetLengthConstRegions, которая принимает на вход файловый поток и возвращает количество постоянных участков в числовой последовательности из этого файла.
Алгоритм работы функции следующий:
- Сначала мы инициализируем переменные
length(количество),region(регион) иequals(равно) со значениями 0. - Затем мы читаем первый элемент из потока и сохраняем его в переменной
numbPrev(предыдущее число). - После этого мы входим в цикл, пока можем прочитать следующее число из потока и сохраняем его в переменной
numbNext(следующее число). - Мы проверяем, равны ли
numbPrevиnumbNext. Если да, то устанавливаем значениеequals(равно) в 1. - Мы добавляем
equalsкlength(количество), а затем обновляемregion(регион) значениемequals. - Мы обновляем
numbPrevзначениемnumbNext, чтобы подготовиться к следующей итерации. - Мы повторяем шаги с 3 по 6 до тех пор, пока можем читать числа из потока.
- После выхода из цикла мы добавляем значение
regionкlength(количество). - Наконец, мы возвращаем
length(количество) из функции. В функцииmainмы открываем файл для чтения из стандартного ввода (если аргумент не указан) или из файла, указанного в аргументе командной строки. Затем мы вызываемGetLengthConstRegionsс этим файловым потоком и выводим результат на стандартный вывод.