如何每四个循环以及每隔一个循环做一些事情?

How to go about doing something every fourth loop as well as every other loop?

int doEveryTwoTimes= 1;  // Counter to do something every two loops
int doEveryFourTimes= 2; // Counter to do something every four loops 

// add a nested infinite loop to increment counter
while(true){
    if(doEveryTwoTimes%2 == 0){
        // DO STUFF EVERY **TWO** LOOPS
    }

    if(?????){
        // DO STUFF EVERY **FOUR** LOOPS
    }

    doEveryTwoTimes++;
    doEveryFourTimes++;
}

我可以添加一个条件让每两个循环发生一次,但是如何为每个 第四个 循环创建一个条件?

if (count % 4 == 0) {
    // Stuff
}

关键是,对于任何 n,每个 n 循环都是通过使用 mod n == 0 来完成的。 (严格来说,您可以针对小于 n 的任何数字进行测试,但 0 很方便,因为它 always 小于 n, 对任何自然数 n.)

此外,对于任意数量的此类操作,您只需要一个计数器,因为计数器会独立于所有这些操作递增。

您甚至可以使用无条件 for 循环,如下所示:

for (int count = 0; true; count++) {
    if (count % 2 == 0) {
        // Stuff every other loop
    }
    if (count % 4 == 0) {
        // Stuff every fourth loop
    }
}

它会时不时地悄无声息地溢出,但这不会对 2 的幂的模数产生任何真正的影响。但是如果你想每五次循环做一些事情,你每次都会遇到奇怪的故障它翻了过来。要修复 that,找到您正在使用的各种间隔的最小公倍数(对于所有可能的间隔,最多为 12,27720 就可以)并像这样使用它:

while (true) {
    for (int count = 0; count < 27720; count++) {
        if (count % 5 == 0) {
            // Stuff every fifth loop
        }
        if (count % 12 == 0) {
            // Stuff every twelfth loop
        }
    }
}

这确保 所有 模数同时达到 0,就在您从 0 开始另一个循环时。(最小公倍数很快变得非常大有很多很多间隔,你可能必须使用 longs 或 long longs 来存储计数器。long long 和最大 5342931457063200 应该允许你触发同一循环中从 2 到 40 的每个间隔的不同代码路径。如果您需要比这更多的间隔,则需要 运行 单独的计数器。)