压缩嵌套循环

Condensing nested loops

本文关键字:嵌套循环 压缩      更新时间:2023-10-16

我正在尝试转换这3个循环:

for (a = 1; a < amax; a++) {
    for (b = 1; b < bmax; b++) {
        for (c = 1; c < cmax; c++) {
            ...
        }
    }
}

到单循环。

我试过了:

for (abc = 0; abc < (amax * bmax * cmax); ++abc)
{
    a = abc / (bmax * cmax) + 1;
    b = (abc % (bmax * cmax)) / cmax + 1;
    c = (abc % (bmax * cmax)) % cmax + 1;
    ...
}

,但它不是等价的。逻辑错误在哪里?

a循环有amax-1迭代,没有amax迭代。bc环也是如此。因此,单循环应该有(amax-1)*(bmax-1)*(cmax-1)迭代。

要提取abc的值,将单循环索引视为混合基数(相乘得到迭代次数的基数),即简单的整数除法和余数运算。

每个值加1

你的第一个循环运行的时间远远少于第二个循环。

想象

int amax = 3;
int bmax = 3;
int cmax = 3;

第一个循环有2,2,2 = 8次迭代。

第二个循环将从0运行到

在a,b,c的计算中也有一些问题,检查以下/注意abc从1开始,条件是<=:-(c代码-好久没碰c++了)

   int x = 1;
   amax-=1; 
   bmax-=1; 
   cmax-=1;
    int a = 1, b = 1, c = 1;
    for (int abc = 1; abc <= (amax * bmax * cmax); ++abc)
    {
        c = abc % cmax;
        c = c != 0 ? c : cmax;
        var m = ' a='+a+' b='+b+' c='+c+'  ::::'+(x++);
        printf("%sn", m); 

        a = abc < (bmax*cmax) || abc % ((bmax*cmax)) != 0 ? a : (a + 1) % amax;
        a = a != 0 ? a : amax;
        b = abc < cmax || abc % (cmax) != 0 ? b : (b + 1) % bmax;
        b = b != 0 ? b : bmax;
    }