如何在每个第四个循环以及每个其他循环中执行某些操作?

Joh*_*ust 1 c loops modulus

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++;
}
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*ggy 9

if (count % 4 == 0) {
    // Stuff
}
Run Code Online (Sandbox Code Playgroud)

关键是每n个循环的动作是通过使用mod n == 0任何n来完成的.(严格说来,你可以测试对任何数量小于ñ,但0是方便,因为它总是小于ñ,对任何自然数ñ.)

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

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

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

它会不时地静默地溢出,但这对于2的幂的模数没有任何实际的区别.但是如果你想每隔五个循环做一些事情,那么每次它翻转时你都会得到奇怪的故障.要解决这个问题,找到你正在使用的各种间隔的最小公倍数(对于所有可能的间隔,最多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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样可以确保所有模数同时正好0,就在你开始另一个0循环的时候.(最小的常数倍数非常快,很多很多间隔,你可能不得不使用longs或者long long用于存储计数器.long long并且最多5342931457063200允许您在同一循环中为每个间隔(从2到40)触发不同的代码路径.如果需要更多的间隔,则需要运行单独的计数器.)