大家好我有以下问题:
我有一个长度为4的倍数的数组,例如:
{1,2,3,4,5,6,7,8}
我想知道如何获得以下对中的数字:{1,4},{2,3},{5,8},{6,7} ......(等)< / p>
假设我循环遍历它们,我想从当前索引
获取对成员的索引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**
(我认为线性函数就足够了)
它会导致: f(i)= j = -i + 5 。
如何为超过4名成员推广这一点?如果您需要配对元素的通用公式,您会怎么做?
答案 0 :(得分: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}.
答案 1 :(得分: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
}
答案 2 :(得分: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;
}
如果您只是在寻找计算指数的公式,那么in general case it's:
int f(int i, int k = 4) {
return i + k - 2 * (i % k) - 1;
}
原来你的特殊情况(大小4)是sequence A004444 in OEIS。
一般情况下,您有"nimsum n + (size-1)"。