Общая формула для спаривания членов массива?

Привет, ребята, у меня возникла следующая проблема:

У меня есть массив с длиной, кратной 4, например:

{1,2,3,4,5,6,7,8}

Я хочу знать, как я могу получить числа в следующих парах: {1,4}, {2,3}, {5,8}, {6,7} ….. (и т. Д.)

Предположим, что я перебираю их и хочу получить индекс члена пары из моего текущего индекса

int myarr[8]={1,2,3,4,5,6,7,8};

for(int i=0;i<8;i++)
**j= func(i)**

Я думал о чем-то вроде этого:

F (1) = 4
F (4) = 1
и я бы взял: **f(i)=a * i + b**
(я думаю, что линейной функции достаточно)
Это приведет к: е (я) = J = -i + 5 .
Как я могу обобщить это для более чем 4 членов? Что вы делаете в тех случаях, когда вам нужна общая формула для парных элементов?

2

Решение

В основном, если i странно j было бы i+3, иначе j = i+1;

int func(int i) {
if(i%2 != 0)
return i+3;
else
return i+1;
}

Это сгенерирует

func(1) = 4, func(2) = 3, func(5) = 8, func(6) = 7 // {1,4},{2,3},{5,8},{6,7}.
2

Другие решения

Вы можете сделать это следующим образом, сохранив инкрементную итерацию, но используя функцию, зависящую от текущего блока и остатка, следующим образом.

int myarr[8]={1,2,3,4,5,6,7,8};

int Successor(int i)
{
int BlockStart = i / 4;
int Remainder = i % 4;
int j = 0;
if ( Remainder == 0 )
j = 0;
else if ( Remainder == 1 )
j = 3;
else if ( Remainder == 2 )
j = 1;
else if ( Remainder == 3 )
j = 2
return BlockStart + j;
}

for(int i = 0; i < 8; i++)
{
j = f(i);
// usage of the index
}
1

По поводу обобщения, это должно сделать это:

auto pairs(const vector<int>& in, int groupLength = 4) {
vector<pair<int, int>> result;
int groups = in.size() / groupLength;
for (int group = 0; group < groups; ++group) {
int i = group * groupLength;
int j = i + groupLength - 1;
while (i < j) {
result.emplace_back(in[i++], in[j--]);
}
}
return result;
}

Вы можете запустить этот код онлайн.

Если вы просто ищете формулу для расчета индексов, то в общем случае это:

int f(int i, int k = 4) {
return i + k - 2 * (i % k) - 1;
}

Оказывается, ваш особый случай (размер 4) последовательность A004444 в OEIS.

В общем у вас есть «nimsum n + (размер-1)».

1
По вопросам рекламы [email protected]