Выделить знакопостоянную подпоследовательность наибольшей длины и упорядочить ее по убыванию - C (СИ)

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

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

Дана последовательность a1,...,an (n<=100) действительных чисел. выделить из нее знакопостоянную подпоследовательность наибольшей длины и упорядочить ее по убыванию.
#include <stdio.h>
  #include <conio.h>
     void main()
     {
 int q,p,a,b,i,j,N,c,Cmax,mas[100],mas1[50]={0};
clrscr();
printf("N=");
 scanf("%d",&N);
 
 for(i=0;i<N;i++)
  scanf("%d",&mas[i]);
                          a=0;b=0;c=0;Cmax=0;
    for(i=0;i<N;i++)
     if(mas[i]*mas[i+1]<=0)
      {
          if(c==0)
             a=i;
 
       c=c+1;
          if (c>Cmax)
           {
            b=i;
            Cmax=c;
           }
       }
       else
       c=0;

  for(i=0,j=a;j<=b;i++,j++)
  {
  mas1[i]=mas[j];
 
  }
  for(i=0; i<Cmax-1;i++)
  for(j=0;j<Cmax;j++)
  if (mas1[j]<mas1[j+1])
  {
  p=mas1[i];
  mas1[i]=mas1[i+1];
  mas1[i+1]=p;
  }
  for(i=0;i<Cmax;i++)
  printf("%d\t",mas1[i]);
           getch();
      }
В общем неверно сохраняется конец подпоследовательности, точнее ошибка где-то в a=i и b=i, помогите найти...

Решение задачи: «Выделить знакопостоянную подпоследовательность наибольшей длины и упорядочить ее по убыванию»

textual
Листинг программы
#include <stdio.h>
#include <conio.h>
void main()
{
int p,b,i,j,N,c,Cmax,mas[100],mas1[50]={0};
clrscr();
printf("N=");
scanf("%d",&N);
 
for(i=0;i<N;i++)
scanf("%d",&mas[i]);
b=0;c=0;Cmax=0;
for(i=0;i<=N;i++)
if(mas[i]*mas[i+1]<=0 || i==N)
{
if (c>Cmax)
{
b=i;
Cmax=c;
if(i==N)
{
b--;
Cmax--;
}
}
c=0;
}
else
{
    c++;
}
 
for(i=0,j=b-Cmax;j<=b;i++,j++)
{
mas1[i]=mas[j];
}
Cmax++;
for(i=0; i<Cmax-1;i++)
for(j=0;j<Cmax-1-i;j++)
if (mas1[j]<mas1[j+1])
{
p=mas1[j];
mas1[j]=mas1[j+1];
mas1[j+1]=p;
}
for(i=0;i<Cmax;i++)
printf("%d\t",mas1[i]);
getch();
}

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

Этот код находит наибольшую сумму подмассива из неотрицательных чисел и упорядочивает его элементы по убыванию. Вот список действий, которые он выполняет:

  1. Ввод числа N, которое указывает количество чисел в массиве.
  2. Чтение N чисел и сохранение их в массиве mas.
  3. Инициализация переменных b, c, Cmax, i и j.
  4. Начало цикла, который проходит по всем элементам массива, проверяя, является ли текущий элемент положительным или отрицательным.
  5. Если текущий элемент положительный, то он добавляется к сумме c.
  6. Если сумма c становится больше Cmax, то обновляется значение Cmax и сбрасывается счетчик c.
  7. Если текущий элемент отрицательный или это последний элемент массива, то начинается новая подсумма с предыдущего положительного элемента.
  8. Копирование элементов из исходного массива в массив mas1, начиная с самого большого элемента.
  9. Сортировка массива mas1 в порядке убывания.
  10. Вывод отсортированного массива на экран. Вот как выглядит отсортированный массив: [Cmax-1, Cmax-2, ..., 1]

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


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

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

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