Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 压缩嵌套循环_C++_C_Loops_For Loop_Optimization - Fatal编程技术网

C++ 压缩嵌套循环

C++ 压缩嵌套循环,c++,c,loops,for-loop,optimization,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++) { ... } } } (a=1;a

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

for (a = 1; a < amax; a++) {
    for (b = 1; b < bmax; b++) {
        for (c = 1; c < cmax; c++) {
            ...
        }
    }
}
(a=1;a{ 对于(b=1;b 到单个循环

我试过这个:

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;

    ...
}
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
迭代。
b
c
循环也一样。因此,单个循环应该有
(amax-1)*(bmax-1)*(cmax-1)
迭代

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


在每个结果值上加1。

第一个循环的运行次数远远少于第二个循环

想象

int amax = 3;
int bmax = 3;
int cmax = 3;
第一个循环有2,2,2=8次迭代

第二个循环将运行0到
(3*3*3=27)
,即
27次


此外,在a、b、c校验的计算中也存在一些其他问题。以下/注意abc从1开始,条件是
b=(abc%(bmax*cmax))/cmax+1应该是
b=(abc%(amax*cmax))/cmax+1同样适用于c:
c=(abc%(amax*bmax))%cmax+1Discalaimer:并不是说它们现在是等价的(可能会有更多的错误)。增加一堆划分不是更悲观吗?而且它的启动可读性要差得多。@DanMašek是的,这通常是个坏主意,但是这是一个必要的破解,因为我想使用OpenMP parallel for(而且OpenMP 2.0不支持折叠操作符)。从
使用
div()
有什么好处吗<代码>div_t r1=div(abc,(bmax*cmax);div_t r2=div(r1.rem,cmax);
   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;
    }