2

大家好,我遇到以下问题:

我有一个长度为 4 的倍数的数组,例如:

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

我想知道如何获得以下对中的数字:{1,4},{2,3},{5,8},{6,7}.....(etc)

假设我遍历它们并且我想从我当前的索引中获取对成员的索引

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
并且 i 将采用:( **f(i)=a * i + b**
我认为线性函数就足够了)
它会导致:f(i)=j=-i+5
我如何将这个概括为超过 4 个成员?如果您需要一个通用公式来配对元素,您会怎么做?

4

3 回答 3

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}.
于 2017-05-03T15:48:15.313 回答
1

您可以通过保持增量迭代来执行以下操作,但使用取决于当前块和其余部分的函数,如下所示。

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
}
于 2017-05-03T15:44:10.027 回答
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号)是OEIS 中的序列 A004444

一般来说,你有"nimsum n + (size-1)"

于 2017-05-03T16:14:48.883 回答