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;
}
}
添加回答
舉報