冷凝嵌套循环

时间:2016-10-19 21:54:37

标签: c++ c loops for-loop optimization

我正在尝试转换这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;

    ...
}
然而,它并不等同。哪里是逻辑错误?

2 个答案:

答案 0 :(得分:2)

a循环有amax-1次迭代,而不是amax次迭代。同样适用于bc循环。因此,单循环应该有(amax-1)*(bmax-1)*(cmax-1)次迭代。

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

为每个结果值添加1。

答案 1 :(得分:1)

你的第一个循环远远少于第二个循环。

想象

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

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

第二个循环将通过0到&lt; (3 * 3* 3 = 27)27

此外,在计算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("%s\n", 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;
    }