Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数组成员配对的一般公式?_C++_Algorithm_Pairing - Fatal编程技术网

C++ 数组成员配对的一般公式?

C++ 数组成员配对的一般公式?,c++,algorithm,pairing,C++,Algorithm,Pairing,大家好,我有以下问题: 我有一个长度为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)** int myarr[8]={1,2,3,4,5,6,7,8}; 对于(int i=0;i您可以通过保持增量迭代

大家好,我有以下问题:

我有一个长度为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)**
int myarr[8]={1,2,3,4,5,6,7,8};

对于(int i=0;i您可以通过保持增量迭代来执行以下操作,但使用的函数取决于当前块和剩余部分,如下所示

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
}
int myarr[8]={1,2,3,4,5,6,7,8};
整数后继(整数i)
{
int BlockStart=i/4;
整数余数=i%4;
int j=0;
如果(余数==0)
j=0;
else if(余数=1)
j=3;
else if(余数=2)
j=1;
否则如果(余数==3)
j=2
返回BlockStart+j;
}
对于(int i=0;i<8;i++)
{
j=f(i);
//索引的使用
}

基本上,如果
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}.

关于泛化,应该这样做:

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;
}
原来你的特殊箱子(4号)是


一般来说,你有。

我是否正确理解,一般来说,你想要将数组分成四个一组,然后将每组四个的第一个元素与最后一个元素配对,并将中间的两个元素配对?我不想打断。我只需要配对元素J的索引,它取决于循环I.A的当前索引是的,我希望它们处于这种关系中:第一个是第四个,第二个是第三个。虽然数组确实是4的倍数。谢谢你的回答,但我想循环遍历所有数组。我不希望增量条件发生变化。我只想对pair元素做些什么,pair元素的索引是什么?(假设当前元素为I,J=f(I)…我如何在每次迭代中计算J?谢谢你,先生…该死的,我太笨了,我想进入软件开发领域…不断学习,不断编程。你会成功的。对于经验丰富的开发人员来说,事情是显而易见的,因为我们以前已经做过1000次了。谢谢你,先生…关于如何更好地发现这类问题,有什么建议吗关于模式、公式?@user1913744我只是把你用自然语言描述的东西形式化为一个数学函数。我通过例子来做,思考具体的数字,看看需要应用什么运算才能得到结果。所以知道哪些运算是可用的是一部分。第二部分是举一个小例子,并进行处理用铅笔和纸,有点像模拟计算机,记录过程的每一步。从这一点上,通常可以计算出你想要给计算机的指令,这样它就可以像你刚才用手做的一样。在这种特殊情况下,你想用铅笔和纸做的例子就是你发布的例子d:先为数字1找一对,然后为数字2找一对,然后为数字3找一对,依此类推。。。
int f(int i, int k = 4) {
    return i + k - 2 * (i % k) - 1;
}