我正在尝试转换这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;
...
}
然而,它并不等同。哪里是逻辑错误?
答案 0 :(得分:2)
a
循环有amax-1
次迭代,而不是amax
次迭代。同样适用于b
和c
循环。因此,单循环应该有(amax-1)*(bmax-1)*(cmax-1)
次迭代。
要提取a
,b
和c
值,请将单循环索引视为混合基数(乘以找到迭代次数的基数),即简单的整数除法和余数运算。
为每个结果值添加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;
}