压缩嵌套循环
Condensing nested loops
我正在尝试转换这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
迭代。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运行到
在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;
}
相关文章:
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 了解嵌套循环打印星号图案
- 无法掌握嵌套循环的写作技巧
- 在 c++ 中实现嵌套循环的更短方法吗?
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 毕达哥拉斯三重嵌套循环误解
- T(n) 表示嵌套循环
- 2 个嵌套循环的时间复杂度
- 嵌套循环背后的逻辑
- 使用 %s C++嵌套循环
- 嵌套循环和重复迭代器
- 如何在 c++ 下使用嵌套循环和正则表达式降低时间复杂度?
- C++在乘法图中放置随机值(嵌套循环)
- 如何使用 OpenMP 减少嵌套循环?
- 为什么使用 2 个嵌套循环 O(n^2) 复杂度来解决二和问题,当只改变循环计数器逻辑时运行得更快?
- 学习嵌套循环C++与示例混淆
- 如何在CUDA中嵌套循环
- std::vector上的嵌套循环
- 为循环嵌套的C++压缩
- 压缩嵌套循环