Заменить отрицательные элементы в знакочередующейся последовательности на минимальный положительный элемент этой з.ч. последовательности
Например, в массиве {3 5 -4 6 -2 7 9 10 -11 15 13} последовательность { 5 -4 6 -2 7} - знакочередующаяся. Нужно заменить -4 и -2 на 5 (минимальное значение положительного элемента в этой знакочередующейся последовательности)
Вывод: 3 5 5 6 5 7 9 10 -11 15 13
У меня получается совсем другой вывод, а именно: {3 5 5 6 6 7 9 10 10 15 13}
Подскажите, пожалуйста, как исправить код.
cout << "n: ";
int n = 0;
cin >> n;
int* array = new int[n];
for (int i = 0; i < n; i++) {
cin >> array[i];
}
cout << endl;
int min = 0;
for (int i = 0; i < n; i++) {
if (array[i] > 0)
min = array[i];
if ((array[i] > 0) && (array[i + 1] < 0))
array[i + 1] = min;
cout << array[i] << "\t";
}
Ответы (1 шт):
В примере получается две таких последовательности:
- {5 -4 6 -2 7};
- {10 -11 15};
В вашем коде, если минимальное положительное число будет в середине или конце последовательности, значение не будет взято.
if ((array[i] > 0) && (array[i + 1] < 0)) - выход за предел массива при i = n - 1.
В конце программы нет удаления динамического массива - оператор delete [] _имя указателя_.
Написал код, протестировал, вроде работает как поставлена задача.
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main()
{
setlocale(LC_ALL, "");
/*cout << "Enter n: ";
int n = 0;
cin >> n;
int* arr = new int[n];
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}*/
const int n = 11;
int arr[n] = { 3, 5, -4, 6, -2, 1, 9, 15, -11, 10, 13 };
int min;
cout << "Source array :\t\t";
for (auto &ind : arr) {
cout << ind << " ";
}
cout << endl << endl;
for (int i = 0, j = 0; i < n; ++i) {
int k = 0;
if (((arr[i] >= 0) && (arr[i + 1] < 0) && i != n - 1) || ((arr[i] < 0) && (arr[i + 1] >= 0) && i != n - 1)) {
j = i;
if (arr[i] > 0) {
min = arr[i];
}
else {
min = arr[i + 1];
}
while (((arr[j] >= 0) && (arr[j + 1] < 0) && j < n) || ((arr[j] < 0) && (arr[j + 1] >= 0) && j < n)) {
if (arr[j] >= 0 && arr[j] < min) {
min = arr[j];
}
++k;
++j;
}
if (arr[j] >= 0 && arr[j] < min) {
min = arr[j];
}
for (int t = i; t < i + k; ++t) {
if (arr[t] < 0) {
arr[t] = min;
}
}
i += k;
}
}
cout << "Modified array :\t";
for (auto &ind : arr)
{
cout << ind << " ";
}
cout << endl << endl;
//delete[] arr;
system("pause");
return 0;
}
Результат работы программы:
Source array : 3 5 -4 6 -2 1 9 15 -11 10 13
Modified array : 3 5 1 6 1 1 9 15 10 10 13
Для продолжения нажмите любую клавишу . . .