Array85. Дан массив $$A$$ размера $$N$$ и целое число $$K$$ ($$1 \leq K \leq 4, K \lt N$$). Осуществить циклический сдвиг элементов массива вправо на $$K$$ позиций (при этом $$A_1$$ перейдет в $$A_{K+1}$$, $$A_2$$ — в $$A_{K+2}$$, $$…$$, $$A_N$$ — в $$A_K$$). Допускается использовать вспомогательный массив из $$4$$ элементов.
Решение:
Без дополнительного массива:
Осуществляется K сдвигов в права на 1 элемент.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
program Array85; var a : array[1..10] of Integer; N,K,i,i2,An:Integer; begin Write('N: '); Readln(N); Write('K: '); Readln(K); Writeln('A: '); for i:=1 to N do begin write(i,' :'); readln(a[i]); end; for i2:=1 to K do begin An:=A[N]; for i:=N downto 2 do a[i]:=a[i-1]; a[1]:=An; end; for i:=1 to N do writeln(i,' :',a[i]); end. |
С дополнительным массивом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
{$APPTYPE CONSOLE} program Array85; var a : array[1..10] of Integer; atemp : array[1..4] of Integer; N,K,i:Integer; begin Write('N: '); Readln(N); Write('K: '); Readln(K); Writeln('A: '); for i:=1 to N do begin write(i,' :'); readln(a[i]); end; for i:=1 to K do atemp[i]:=a[N-K+i]; for i:=N downto K+1 do a[i]:=a[i-K]; for i:=1 to K do a[i]:=atemp[i]; for i:=1 to N do writeln(i,' :',a[i]); end. |
Задачи из раздела Array можно посмотреть здесь.
Без допмассива строка 23 аналогично Array83:
for i:=N downto 2 do a[i]:=a[i-1];
Поправил, как предложено.
С допмассивом вроде так, но нужно проверить
for i:=n-k+1 to N do atemp[i-N+K]:=a[i]; for i:=N downto K+1 do a[i]:=a[i-K];
А это поправил чуть подругому, изменил цикл:
for i:=n-k+1 to N do atemp[i-N+K]:=a[i];
на
for i:=1 to K do atemp[i]:=a[N-K+i];
Думаю так по логичней будет.
Было:
Стало:
Все верно. По времени постов видно, что 20 минут не мог понять почему не работает. Вывод — ложиться спать нужно вовремя)