Рассмотреть отрезки, идущих подряд членов последовательности, состоящие из полных квадратов. Получить наибольшую из длин рассматриваемых отрезков - 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;
}

Объяснение кода листинга программы

  1. В функции check объявляются следующие переменные: float t, int b, j, len, start_pos, kv, max_len, max_start_pos.
  2. Переменная len инициализируется как -1, а переменная start_pos как -1.
  3. Переменная max_len инициализируется как -1, а переменная max_start_pos как -1.
  4. Переменная kv инициализируется как 0.
  5. Происходит цикл по всем элементам массива a.
  6. Внутри цикла вычисляется значение t как квадратный корень из a[j].
  7. Если t является целым числом и kv равно 0, то начинается новая последовательность полных квадратов, и start_pos устанавливается как j, а len устанавливается как 1, и kv устанавливается как 1.
  8. Если t является целым числом и kv равно 1, то len увеличивается на 1.
  9. Если kv равно 1, то проверяется, есть ли длина текущей последовательности больше максимальной длины. Если это так, то обновляются значения максимальной длины и ее позиции.
  10. Если после цикла kv все еще равно 1, то проверяется, есть ли длина текущей последовательности больше максимальной длины. Если это так, то обновляются значения максимальной длины и ее позиции.
  11. Функция check возвращает максимальную длину.
  12. В функции main объявляются следующие переменные: j, m, a.
  13. Пользователю предлагается ввести значение m.
  14. Динамически выделяется память для массива a с помощью функции malloc.
  15. Пользователю предлагается ввести значения для массива a.
  16. Функция check вызывается с аргументами m и a.
  17. Память, выделенная для массива a, освобождается с помощью функции free.
  18. Функция main возвращает 0, что означает успешное завершение программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.545 из 5
Похожие ответы