Осуществить сдвиг элементов массива вправо на k позиций - C (СИ)
Формулировка задачи:
Дан массив A[N]. заполнить массив В[N] элементами массива A[N], которые удовлетворяют двойному неравенству: A[1]< A[i] или A[i]< A[10]. Незаполненные элементы массива В[N] заполнить оставшимися элементами массива A[N]. Осуществить сдвиг вправо на k позиций, где k – число оставшихся элементов массива A[N].
Как можно решить данную задачу? Прошу помочь
Если не сложно можете сразу с кодом написать
Хочу раз и навсегда понять и запомнить данную задачу
Решение задачи: «Осуществить сдвиг элементов массива вправо на k позиций»
textual
Листинг программы
#include <stdio.h>
int main() {
// A[0] A[N-1]
// v v
int A[] = {3,6,1,4,7,5,9,2,8};
int N = sizeof(A) / sizeof(int);
int B[N]; // вроде не по стандарту, но так проще всего.
// вспомогательные переменные
int k = 0;
int i, j, offset;
// выводим A.
printf("A = [_");
for (i=0; i<N; i++)
printf("%d_", A[i]);
printf("]\n");
// найдём k.
for (i=0; i<N; i++)
if (A[0] < A[i] && A[i] < A[N-1])
k++;
printf("k = %d.\n", k);
for (i=0; i<N; i++)
B[i] = 0;
printf("B = [_");
for (i=0; i<N; i++)
printf("%d_", B[i]);
printf("] (start) \n");
// заполняем подходящими числами
j = 0;
for (i=0; i<N; i++)
if (A[0] < A[i] && A[i] < A[N-1]) {
B[j] = A[i];
j++;
}
printf("B = [_");
for (i=0; i<N; i++)
printf("%d_", B[i]);
printf("] (1) \n");
// заполним оставшимися числами
j = k;
for (i=0; i<N; i++)
if (!(A[0] < A[i] && A[i] < A[N-1])) {
B[j] = A[i];
j++;
}
printf("B = [_");
for (i=0; i<N; i++)
printf("%d_", B[i]);
printf("] (2) \n");
// сдвиг вправо
for (i=0; i<N; i++) {
if (k-1-i >= 0)
B[N-1-i] = B[k-1-i];
else
B[N-1-i] = 0;
}
printf("B = [_");
for (i=0; i<N; i++)
printf("%d_", B[i]);
printf("] (3) \n");
return 0;
}