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)
我可以添加一个条件来使事情每两个循环发生一次,但是如何为每个第四个循环创建一个条件?
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循环的时候.(最小的常数倍数非常快,很多很多间隔,你可能不得不使用long
s或者long long
用于存储计数器.long long
并且最多5342931457063200
允许您在同一循环中为每个间隔(从2到40)触发不同的代码路径.如果需要更多的间隔,则需要运行单独的计数器.)