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