Google says:
Роман
(26.06.09 ):
<?
$A = array();
$n = 100;
$m = 50;
for($i=1; $i<=$n; $i++)
{
$A[$i] = $i;
}
//**********************
for($j=1; $j<=$m; $j++)
{
$tmpElem = $A[$n];
for($i=$n; $i>1; $i--)
{
$A[$i] = $A[$i-1];
}
$A[1] = $tmpElem;
}
//**********************
print_r($A);
?>
Аноним
(16.02.10 ):
Роману: ну и чаво? каждый элемент у тебя сдвигается M раз, а по условию должен сдвигаться только однажды. кроме того, $tmpElem -- это фактически вспомогательная таблица, которую по условию использовать запрещено.
хитрость тут в том, что для обмена i-того и i+m-того элементов нужно использовать такой алгоритм:
a[i]-=a[i+m];
a[i+m]+=a[i];
a[i]=a[i+m]-a[i];
вот как правильно:
<?
$A = array();
$n = 100;
$m = 50;
for($i=1; $i<=$n; $i++)
{
$A[$i] = $i;
}
//**********************
for($i=1; $i<=$m; $i++)
{
$A[$i] = $A[$i]-$A[$i+$m];
$A[$i+$m] = $A[$i+$m]+$A[$i];
$A[$i] = $A[$i+$m]-$A[$i];
}
//**********************
print_r($A);
?>
PS вообще-то говоря, редакция не указала, что M должно быть половиной N. без такой оговорки решения в общем случае не существует
Paul
(05.08.11 ):
Это классическая задача, называется циклический сдвиг.
Есть простое решение, когда каждый элемент перемещается 2 раза.
1 раз это значит нужен НОД (или gcd по-английски).
Ответ редакции :
Раз классическая то что, можно не решать?
Так дело не пойдёт.
Никита
(21.05.16 ):
Реализация на VBA
Sub SwapTest()
Dim n As Integer, j As Integer, A(20) As Integer
n = 20
For j = 1 To n
A(j) = Cells(1, j).Value
Next j
Call Swap(A(), n, 8)
For j = 1 To n
Cells(2, j).Value = A(j)
Next j
End Sub
Function NOD(A As Integer, B As Integer) As Integer
Dim A_tmp As Integer, B_tmp As Integer
A_tmp = A
B_tmp = B
While A_tmp <> B_tmp
If A_tmp > B_tmp Then
A_tmp = A_tmp - B_tmp
Else
B_tmp = B_tmp - A_tmp
End If
Wend
NOD = A_tmp
End Function
Sub Swap(MyArray() As Integer, n As Integer, k As Integer)
Dim j As Integer, i As Integer, tmp As Integer
For i = 1 To NOD(n, k)
tmp = MyArray(i)
For j = 1 To n / NOD(n, k)
If i > k Then
i = i - k
Else
i = n - k + i
End If
MyArray(i) = MyArray(i) + tmp
tmp = MyArray(i) - tmp
MyArray(i) = MyArray(i) - tmp
Next j
Next i
End Sub