Выделить знакопостоянную подпоследовательность наибольшей длины и упорядочить ее по убыванию - C (СИ)
Формулировка задачи:
Дана последовательность a1,...,an (n<=100) действительных чисел. выделить из нее знакопостоянную подпоследовательность наибольшей длины и упорядочить ее по убыванию.
В общем неверно сохраняется конец подпоследовательности, точнее ошибка где-то в a=i и b=i, помогите найти...
#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(); }
Решение задачи: «Выделить знакопостоянную подпоследовательность наибольшей длины и упорядочить ее по убыванию»
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(); }
Объяснение кода листинга программы
Этот код находит наибольшую сумму подмассива из неотрицательных чисел и упорядочивает его элементы по убыванию. Вот список действий, которые он выполняет:
- Ввод числа N, которое указывает количество чисел в массиве.
- Чтение N чисел и сохранение их в массиве mas.
- Инициализация переменных b, c, Cmax, i и j.
- Начало цикла, который проходит по всем элементам массива, проверяя, является ли текущий элемент положительным или отрицательным.
- Если текущий элемент положительный, то он добавляется к сумме c.
- Если сумма c становится больше Cmax, то обновляется значение Cmax и сбрасывается счетчик c.
- Если текущий элемент отрицательный или это последний элемент массива, то начинается новая подсумма с предыдущего положительного элемента.
- Копирование элементов из исходного массива в массив mas1, начиная с самого большого элемента.
- Сортировка массива mas1 в порядке убывания.
- Вывод отсортированного массива на экран. Вот как выглядит отсортированный массив: [Cmax-1, Cmax-2, ..., 1]
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д