一、问题引出
切入正题,如果现在需要写一段3重嵌套循环,我们会习以为常的用i、j和k三个变量,写出如下格式代码
for(int i=0; i<10; i++){
for(int j=0; j<5; j++){
for(int k=0; k<8; k++){
}
}
}
但是如果要求只用一个循环就实现以上3重循环,有一个明显的优点就是可以节省内存,本来三个变量现在只需一个变量。这该怎么实现呢?
二、抛砖引玉
现在先看看一下例子,帮助理解。
现在有一12位二进制数 A = 1011 0111 0110
,如何取得其第0-3位呢(0110)?
这无非就是模与除的操作。
0-3位的值 = A % 24 = 0110
4-11位的值 = A / 24 = 1011 0111
4-6位的值 = A / 24 % 23 = 1011 0111 % 23 = 111
如果上面这个例子能够理解,那么这篇笔记的重点便被你掌握了。
三、直捣黄龙
for(int i=0; i<10; i++){
for(int j=0; j<5; j++){
for(int k=0; k<8; k++){
}
}
}
这个3重循环中,总共需要循环 10 x 5 x 8 = 400 次循环,那我我们可以用A = 400 来表示这个循环,
while(A--){
}
此时,A可以看成由i j k
组成的类似于二进制数机制,在每次循环中,i、j和k所代表的值,如下:
k = A % (k所表示的范围) = A % 8
j = A / (k所表示的范围) % (j所表示的范围) = A / 8 % 5
i = A / (j、k所表示的范围) % (i所表示的范围) = A / (5 x 8 ) % 10