Можно ли выполнить смещение за один цикл?
Дан массив размера N. Вставить элемент с нулевым значением перед минимальным и после максимального элемента массива.
Вот мой код.
/* Array103. Дан массив размера N. Вставить элемент с нулевым значением
перед минимальным и после максимального элемента массива. */
#include <stdio.h>
#include <locale.h>
#include <windows.h>
#include <limits.h>
const UCHAR Nmax = UCHAR_MAX;
int main()
{
setlocale(LC_ALL, "");
UCHAR N = 0, // N - размер массива.
min_i = 0, //min_i - индекс минимального элемента.
max_i = 0; // max_i - индекс максимального значения.
printf_s("Введите размер массива: ");
scanf_s("%hhu", &N);
if (1 < N && N <= Nmax)
{
ULONGLONG a[Nmax] = {}; // Объявление массива.
printf_s("Введите элементы массива: ");
for (UCHAR i = 0; i < N; i++)
scanf_s("%llu", &a[i]);
for (UCHAR i = 1; i < N; i++) // Нахождение макс и мин элементов и их индексов.
{
if (a[i] < a[min_i])
min_i = i;
else
if (a[i] >= a[max_i])
max_i = i;
}
if (max_i > min_i)
max_i++; // Увеличиваем max_i, потому что его значение перенесется в следующую ячейку массива.
N += 2; // Увеличиваем N для добавления 0 элементов.
for (UCHAR i = N - 1; i > min_i; --i)
a[i] = a[i - 1]; // Сдвигаем массив для добавления 0 элемента.
a[min_i] = 0; // Обнуляем min_i, потому что значение минимума теперь в следующей ячейке массива.
for (UCHAR i = N - 1; i > max_i + 1; --i)
a[i] = a[i - 1]; // Сдвигаем массив для добавления 0 элемента.
a[max_i + 1] = 0;
printf_s("Измененный массив: ");
for (UCHAR i = 0; i < N; i++)
printf_s("%llu ", a[i]);
}
else
printf_s("Введено некорректное число.");
return 0;
}
Можно ли выполнить смещения в массиве для того, чтобы вставить нулевые элементы за один цикл?
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Ну, если у вас есть позиции, куда надо вставить 0, и два свободных места в массиве - то почему бы и нет?... Примерно так:
void addZerosAt(int * a, int N, int p1, int p2)
{
if (p1 > p2)
{
int p = p1;
p1 = p2;
p2 = p;
}
for(int i = N+1; i >= p1; --i)
{
if (i > p2) a[i] = a[i-2];
else a[i] = a[i-1];
}
a[p1] = a[p2] = 0;
}
int main(int argc, const char * argv[])
{
int a[20] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
for(int i = 0; i < 15; ++i) printf("%2d ",a[i]); puts("");
addZerosAt(a,15,5,12);
for(int i = 0; i < 17; ++i) printf("%2d ",a[i]); puts("");
}