我是C ++的新手,我正在努力解决似乎有一个可靠解决方案的问题,但我似乎无法找到它。我有一个从零开始的连续数组:
int i[6] = { 0, 1, 2, 3, 4, 5 }; // this is actually from an iterator
我想将数组分成三个一组。设计是有两个方法j
和k
,这样给定i
它们将返回同一组三个中的另外两个元素。例如:
i j(i) k(i) 0 1 2 1 0 2 2 0 1 3 4 5 4 3 5 5 3 4
解决方案似乎涉及将i
与其值mod三和加号或减号相加,但我似乎无法弄清楚逻辑。
答案 0 :(得分:1)
这应该这样做:
int j(int i)
{
int div = i / 3;
if (i%3 != 0)
return 3*div;
else
return 3*div+1;
}
int k(int i)
{
int div = i / 3;
if (i%3 != 2)
return 3*div+2;
else
return 3*div+1;
}
如果您想要更短的功能:
int j(int i)
{
return i/3*3 + (i%3 ? 0 : 1);
}
int k(int i)
{
return i/3*3 + (i%3-2 ? 2 : 1);
}
答案 1 :(得分:1)
这应该有效:
int d = i % 3;
int j = i - d + ( d == 0 );
int k = i - d + 2 - ( d == 2 );
或以下k语句可能更具可读性:
int k = i - d + ( d == 2 ? 1 : 2 );
答案 2 :(得分:0)
嗯,首先,请注意
j(i) == j(3+i) == j(6+i) == j(9+i) == ...
k(i) == k(3+i) == k(6+i) == k(9+i) == ...
换句话说,您只需要找到
的公式j(i), i = 0, 1, 2
k(i), i = 0, 1, 2
然后对于其他案例,只需插入i mod 3
。
从那里,你很难找到一个简单的公式,因为你的“轮换”不是标准的。而不是
i j(i) k(i)
0 1 2
1 2 0
2 0 1
该公式将是
j(i) = (i + 1) % 3
k(i) = (i + 2) % 3
你有
i j(i) k(i)
0 1 2
1 0 1
2 0 2
目前我能想到的唯一公式是
j(i) = (i == 0 ? 1 : 0)
k(i) = (i == 1 ? 1 : 2)
答案 3 :(得分:0)