Определить периодичность последовательности - C (СИ)
Формулировка задачи:
Помогите написать программу по такому условию на Си. Заранее спасибо.
Массив A(M) заполнен только нулями и единицами. Определите, будет ли полученная последовательность периодической и, если да, то найдите длину наименьшего периода. В конце массива «неполный» период невозможен.
Тест. 1; 0; 0; 0; 1; 0; 0; 0; 1; 0; 0; 0.
Результат. Последовательность периодическая. Т=4.
Формат входных данных. [M] [1-й элемент массива A] [2-й элемент массива A] и т.д. Элементы массива – целые числа в диапазоне [0, 1]. M - целое число в диапазоне [2, 20].
Формат выходных данных. [количество элементов в наименьшем периоде]. Если последовательность непериодическая, то возвращается 0.
Рекомендуемое кол-во циклических операторов (без ввода и вывода данных): 3 (2?)
С уважением.
Решение задачи: «Определить периодичность последовательности»
textual
Листинг программы
period(int* seq, int len) { int i, k; for (k = 1; k <= len / 2; k++) if (len % k == 0) { for (i = k; i < len; i++) if (seq[i] != seq[i%k]) break; if (i == len) return k; } return 0; }
Объяснение кода листинга программы
В данном коде определена функция period, которая принимает два аргумента: seq (указатель на начало последовательности чисел) и len (длина последовательности).
- Создаются две переменные: i (номер текущего элемента последовательности) и k (номер проверяемого периода).
- Запускается цикл, который будет выполняться до тех пор, пока k меньше или равно len / 2.
- Внутри цикла проверяется, делится ли длина последовательности на k без остатка (это может говорить о периодичности).
- Если условие выполняется, то начинается второй цикл, который будет проверять все элементы последовательности, начиная с k-го, на предмет того, совпадают ли они (это может говорить о периодичности).
- Если все элементы совпадают, то возвращается k.
- Если в процессе проверки встречается элемент, который не совпадает с предыдущими k-ыми элементами, то цикл прерывается и функция продолжает поиск периодичности с нового значения k.
- Если циклы завершились без обнаружения периодичности, то возвращается 0.
Пример вызова функции:
int seq[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
int len = sizeof(seq) / sizeof(seq[0]);
int period = period(seq, len);
if (period != 0) {
printf(
Периодичность последовательности: %d\n
, period); } else { printf(Периодичность последовательности не обнаружена\n
); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д