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,通过使用mod n == 0
来执行每个n循环。(严格来说,你可以对小于n的任何数字进行测试,但0很方便,因为对于任何自然数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的幂模产生任何真正的影响。但如果你想每五个循环做一件事,每次它滚动时你都会遇到奇怪的故障。要修复,,请找到您正在使用的各种间隔的最小公倍数(对于所有可能的间隔,最多1277720是可以的),并像这样使用:
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开始另一个循环时。(最小公倍数很快就会变得非常大,有很多间隔,你可能必须使用long
s或long long
s来存储计数器。long long
和最大值5342931457063200
应该允许你在同一循环中为从2到40的每个间隔触发不同的代码路径。如果你需要更多的间隔,你需要运行单独的计数器。)