Рассмотреть отрезки, идущих подряд членов последовательности, состоящие из полных квадратов. Получить наибольшую из длин рассматриваемых отрезков - C (СИ)
Формулировка задачи:
Даны натуральное число n, целые числа a_1 ,…,a_n. Рассмотреть отрезки идущих подряд членов данной последовательности, состоящие из полных квадратов. Получить наибольшую из длин рассматриваемых отрезков. Определить подпрограммы, позволяющие распознать полные квадраты. Вот я тут набросал код, Заранее спасибо
#include <stdio.h> #include <stdlib.h> #include <locale> #include <math.h> void main() { setlocale(LC_ALL,"Russian"); int *mas = NULL; int i,c,f,x,r; int n = 0; double b; printf("Введите натуральное число n:\n"); scanf("%d",&n); mas=(int*)malloc(sizeof(int)*n); printf("Введите целые числа:\n"); c=0; for(i=0;i<n;i++) { scanf("%d",&mas[i]); b=mas[i]; x=sqrt(b); if (x*x==b) c++; } .... free(mas); system("pause"); }
аппп!
Решение задачи: «Рассмотреть отрезки, идущих подряд членов последовательности, состоящие из полных квадратов. Получить наибольшую из длин рассматриваемых отрезков»
textual
Листинг программы
#include <stdio.h> #include <math.h> #include <malloc.h> int check(int m, int* a) { float t; int b, j, len, start_pos, kv, max_len, max_start_pos; // start_pos - позиция с которой начинается полный квадрат // len - длина последовательности, состоящей из полных квадратов // max_len - максимальная длина последовательности, состоящей из полных квадратов // start_pos - позиция с которой начинается максимальная последовательность, состоящей из полных квадратов len = -1; start_pos = -1; max_len = -1; max_start_pos = -1; kv = 0; for(j =0; j<m;j++) { t = sqrt(a[j]); if ( (ceil(t) == floor(t)) && kv == 0) { start_pos = j; len = 1; kv = 1; } else if ((ceil(t) == floor(t)) && kv == 1) { len++; } else if (kv==1) { kv = 0; if (len != 0) { if (len > max_len) { max_len = len; max_start_pos = start_pos; } } } } // end for // if (kv==1) { kv = 0; if (len != 0) { if (len > max_len) { max_len = len; max_start_pos = start_pos; } } } printf("%d %d\n", max_len, max_start_pos); return max_len; } int main() { int j; int m; int* a; printf("m: "); scanf("%d", &m); // aj, j = 1..m a = (int*) malloc(m*sizeof(int)); printf("a: "); for(j=0;j<m;j++) scanf("%d", &(a[j]) ); check(m,a); free(a); return 0; }
Объяснение кода листинга программы
- В функции
check
объявляются следующие переменные:float t
,int b
,j
,len
,start_pos
,kv
,max_len
,max_start_pos
. - Переменная
len
инициализируется как-1
, а переменнаяstart_pos
как-1
. - Переменная
max_len
инициализируется как-1
, а переменнаяmax_start_pos
как-1
. - Переменная
kv
инициализируется как0
. - Происходит цикл по всем элементам массива
a
. - Внутри цикла вычисляется значение
t
как квадратный корень изa[j]
. - Если
t
является целым числом иkv
равно0
, то начинается новая последовательность полных квадратов, иstart_pos
устанавливается какj
, аlen
устанавливается как1
, иkv
устанавливается как1
. - Если
t
является целым числом иkv
равно1
, тоlen
увеличивается на1
. - Если
kv
равно1
, то проверяется, есть ли длина текущей последовательности больше максимальной длины. Если это так, то обновляются значения максимальной длины и ее позиции. - Если после цикла
kv
все еще равно1
, то проверяется, есть ли длина текущей последовательности больше максимальной длины. Если это так, то обновляются значения максимальной длины и ее позиции. - Функция
check
возвращает максимальную длину. - В функции
main
объявляются следующие переменные:j
,m
,a
. - Пользователю предлагается ввести значение
m
. - Динамически выделяется память для массива
a
с помощью функцииmalloc
. - Пользователю предлагается ввести значения для массива
a
. - Функция
check
вызывается с аргументамиm
иa
. - Память, выделенная для массива
a
, освобождается с помощью функцииfree
. - Функция
main
возвращает0
, что означает успешное завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д