2 回答
TA贡献1895条经验 获得超3个赞
此解决方案arr仅计算from的索引i,从而避免需要保持任何状态(例如当前方向)。因此,它有点复杂,但也适用于 的非连续值i。
char arr[] = { '0', '1', '2', '3', '4' };
const int LENGTH = sizeof arr / sizeof(*arr); // not necessary for char
assert(LENGTH > 1); // doesn't work for fewer than 2 elements
const int CYCLE = LENGTH - 1;
for (int i = 0; i < 100; ++i) {
printf("%c ", arr[ (i / CYCLE) & 1 ? CYCLE - i % CYCLE : i % CYCLE ]);
}
printf("\n");
说明:i / CYCLE是数组中循环的编号,并& 1检查该编号的最低有效位以确定方向(位为1的奇数循环向后,偶数循环-从0-向前)。i % CYCLE是前向循环,但由于CYCLE = LENGTH - 1,它没有到达数组的最后一个索引。CYCLE - i % CYCLE是向后循环,从 开始CYCLE - 0,这是前进时未到达的最后一个索引,结束于1,从而避免0再次前进时索引的重复。
换句话说,向前和向后循环都省略了一个索引以避免在改变方向时重复,因此CYCLE = LENGTH - 1,这也意味着LENGTH必须至少2避免被零除。
TA贡献1801条经验 获得超16个赞
也许是这样的:
#define LENGTH 5
int main()
{
char arr[LENGTH] = { 'a','b','c','d','e' };
int current = 0;
int direction = 1;
for (int i = 0; i < 100; i++)
{
printf("%c ", arr[current]);
if (current == 0)
direction = 1;
else if (current == LENGTH - 1)
direction = -1;
current += direction;
}
}
添加回答
举报