кроссворды, задачки, головоломки

Сборник задач разного уровня сложности по математике, информатике, физике, химии, программированию, экономике etc. Логические задачи, SQL задачи, решение задач. Задачи с ответами, а также нерешённые задачи.

Petruchek.Info

Поменять местами части массива

Добавлено: 07.02.09 в 12:30
Метки: информатика

Дана таблица А[1..n], заполненная целыми числами.

Требуется поменять местами элементы с номерами от 1 до m и от m+1 до n.

Порядок элементов в каждой из частей должен быть сохранен.

Использовать вспомогательную таблицу запрещено.

Каждый элемент должен быть перемещен не более одного раза.

У этой задачи пока что нет ответа/решения. Вы можете прислать свой вариант в комментарии.

источник: Запорожская областная олимпиада по информатике, 1992

Комментарии
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
Комментарий от новенького:
Новенький является
Новенький не робот
Знаки на картинке: латинские буквы, арабские цифры


Есть на сайте: Онлайн кроссворды Задачи Онлайн игры Блог
Все работы, опубликованные на сайте — авторские, если не указано иное. Перепечатка возможна только с письменного разрешения владельцев ресурса, с обязательной ссылкой на сайт petruchek.info. Пишите нам: . Сайт должен работать в IE, FF, Opera, Safari.

Реклама:

Разработано в студии "Webous"о проектесайта карта

Реклама: