Получить наибольшую из длин отрезков последовательности, удовлетворяющих заданному условию - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток) Пожалуйста, помогите с задачей. Задано натуральное n, целые числа a1,a2,...,an. Рассмотреть отрезки последовательности a1,a2,...,an (подпоследовательности элементов, которые идут подряд), которые состоят из 1)полных квадратов 2)степеней натурального m 3)простых чисел В каждом случае получить наибольшее из длин отрезков, которые рассматриваются. У меня уже есть наработки, но программа не запускается.
# include <stdio.h>
int square(int n)
{if (n==1) return 1;
int flag=0;
for(int i=2;i<n;)
if (n%i==0){flag=1;
if ((n/i)%i==0) n/=(i*i);
else return 0;
}
else ++i;
if (flag==1) return 1;
else return 0;
}
int step(int y, int x)
{if (x==0) return 1;
else if (x>0) return x*step(y,x-1);
else return step(x, y+1)/x;
}
int prost(int a)
{int n;
for(int i=2;i*i<=n;i++)
if (n%i==0) return 0;
return 1;
}
int MaxPosl(int b[10], int n, int max)
{int i, k; signed int st;
st=-1; max=0;
for(i=2;i<=n+1;)
{if ((b[i]==1) && (b[i-1]==1)) {if (st<0) st=i-1;}
else
if (st>0) {k=i-st; if (k>max) max=k; st=-1;}
}
}
main()
{int a[10], b[10], n, i, max, m;
printf("Vvedite n=\n");
scanf("%i", &n);
printf("Vvedite ishodnij massiv\n");
for(i=0;i<n;i++)
{scanf("%i", &a[i]);}
printf("Ishodnij massiv\n");
for(i=0;i<n;i++)
printf("%5i", &a[i]);
printf("Max psledovatelnost polnyh kwadratow\n");
for(i=1;i<=n;i++)
b[i]=square(a[i]);
MaxPosl(b, n, max);
printf("max=%i", max);
printf("Max posledovatelnost stepenej\n");
printf("Vvedite m=\n");
scanf("%i", m);
for(i=1;i<=n;i++)
b[i]=step(a[i], m);
MaxPosl(b, n, max);
printf("max=%i", max);
printf("Max posledovatelnost prostih chisel\n");
for(i=1;i<=n;i++)
b[i]=prost(a[i]);
MaxPosl(b, n, max);
printf("max=%i", max);
}

Решение задачи: «Получить наибольшую из длин отрезков последовательности, удовлетворяющих заданному условию»

textual
Листинг программы
# include <stdio.h>
int Square(int n)
{if (n==1) return 1;
int flag=0;
for(int i=2;i<n;)
if (n%i==0) {flag=1;
if ((n/i)%i==0) n/=(i*i);
else return 0;}
else ++i;
if (flag==1) return 1;
else return 0;
}
int Step(int n, int x)
{do
{if (n%x==0) n/=x;
else return 0;} 
while (n>1);
return 1;
}
int Simple(int n)
{for(int i=2;i<=n/2;i++)
if (n%i==0) return 0;
return 1;
}
int main()
{int a[100], i, n, length, maxlength, m;
printf("Vvedite n=");
scanf("%i", &n);
printf("Vvedite posledovatelnost\n");
for(i=0;i<n;i++)
{scanf("%i", &a[i]);}
printf("\nPosledovatelnost\n");
for(i=0;i<n;i++)
printf("%5i", a[i]);
printf("\nMax posledovatelnost polnih kwadratow\n");
maxlength=0;
for(i=0;i<n;i++)
{length=0;
while (Square(a[i]))
{length++;
i++;
}
if (length>maxlength) maxlength=length;
}
printf("%i", maxlength);
printf("\nMax posledovatelnost stepenej\n");
printf("Vvedite m=");
scanf("%i", &m);
maxlength=0;
for(i=0;i<n;i++)
{length=0;
while (Step(a[i], m))
{length++;
i++;
}
if (length>maxlength) maxlength=length;
}
printf("%i", maxlength);
printf("\nMax posledovatelnost prostih chisel\n");
maxlength=0;
for(i=0;i<n;i++)
{length=0;
while (Simple(a[i]))
{length++;
i++;
}
if (length>maxlength) maxlength=length;
}
printf("%i", maxlength);
}

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

  1. В функции Square(int n) проверяется, делится ли число n на текущее значение i. Если да, то число n делится на i в степени 2, иначе возвращается 0. Если число n делится на i в степени 2, то возвращается 1. Если число n не делится на i, то переменная i увеличивается на 1. Если число n делится на i в степени 2, то возвращается 1. Если число n не делится на i, то возвращается 0.
  2. В функции Step(int n, int x) проверяется, делится ли число n на x. Если да, то число n делится на x, иначе возвращается 0. Если число n делится на x, то x увеличивается на 1. Если число n делится на x, то возвращается 1. Если число n не делится на x, то возвращается 0.
  3. В функции Simple(int n) проверяется, делится ли число n на i. Если да, то возвращается 0. Если число n не делится на i, то i увеличивается на 1. Если число n делится на i, то возвращается 1.
  4. В функции main() считывается число n и массив a. Затем выводится массив a.
  5. Для каждого числа в массиве a выполняется следующая операция: сначала вызывается функция Square(int n), затем функция Step(int n, int x), затем функция Simple(int n). Для каждой функции вычисляется длина последовательности чисел, на которые число делится без остатка. Если длина последовательности больше текущей максимальной длины, то текущая максимальная длина обновляется. После выполнения всех операций для каждого числа в массиве выводится текущая максимальная длина.
  6. Затем пользователю предлагается ввести число m и выполняется аналогичная последовательность операций для функции Step(int n, int x).

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


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

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

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