队尾幸运编号问题

给出一个数字代码队伍中人数,从第一个人开始报数,报到5就是幸运人,这个人出队,从下一个人开始继续从1开始报数。 请问队伍最后一个人是幸运人的时候是第几个出队的。

function method(n, log = false) {
    let state = Array(n).fill('0');
    let count = 0;
    let i = 0;
    while (n > 0) {
        log && console.log('========================');
        log && console.log(`目前: ${state.join('')}`);
        const deleteNum = Math.ceil((n - i) / 5);
        for (let j = i + 5; j <= n; j += 5) state[j - 1] = 'x';
        log && console.log(`退出${deleteNum}人`);
        const tmpI = i + 5 * deleteNum;
        log && console.log(`tmpI停留在${tmpI}`);
        i = tmpI % n === 0 ? n - 1 : tmpI % n - 1;
        state[i] = 'i';
        log && console.log(`i实际停留在${i}: ${state.join('')}`);
        count += deleteNum;
        if (i === n - 1) return count;
        n -= deleteNum;
        state = state.filter(item => item !== 'x');
        state.splice(i, 1);
        log && console.log(`目前一共退出${count}人: ${state.join('')}`);
        log && console.log(`还剩${n}人`);
    }
}

const input = 7;
console.log(method(input, true));

输出为:

========================
目前: 0000000
退出2人
tmpI停留在10
i实际停留在2: 00i0x00
目前一共退出2人: 00000
还剩5人
========================
目前: 00000
退出1人
tmpI停留在7
i实际停留在1: 0i000
目前一共退出3人: 0000
还剩4人
========================
目前: 0000
退出1人
tmpI停留在6
i实际停留在1: 0i00
目前一共退出4人: 000
还剩3人
========================
目前: 000
退出1人
tmpI停留在6
i实际停留在2: 00i
5

版权

本作品采用 CC BY-NC-ND 4.0 授权。