嵌套For循环中的奇怪行为

时间:2017-10-10 13:13:14

标签: c++

首先,我对C ++很陌生,所以尽量不要对我太苛刻。我写了这段代码:

int LargestProduct (string numStr, int groupSize) {
    int numOfGroups = numStr.size() / groupSize;
    int groupsRemaining = numStr.size() % groupSize;

    int largestProduct = 0, thisProduct = 1;

    for (int i = 1; i <= numOfGroups; i++) {

        for (int j = i; j <= groupSize; j++)
            thisProduct *= (numStr[j-1] - '0');

        if (thisProduct > largestProduct)
            largestProduct = thisProduct;

        thisProduct = 1;
    }

    // .. A bit more irrelevant code here

    return largestProduct;
}

函数调用LargestProduct ("1234567890", 2)应该产生72,但错误地产生6。因此,出于某种原因,此代码将但不是预期的(注意:我编写的这段代码应该计算groupsSize的最大乘积 - 相邻数字在一个大的给定数字{{ {1}})。

我做了一些调试,在嵌套的for循环中发现了一个奇怪的行为。我在第二个for循环中设置了一个断点

numStr

经过一些迭代(例如,8次迭代),这是我期望的 i和j:

thisProduct *= (numStr[j] - '0');

这是真正发生的事情

+--------+---------+
|   i    |    j    |
+--------+---------+
|    1   |    1    |
|    1   |    2    |
|    2   |    1    |
|    2   |    2    |
|    3   |    1    |
|    3   |    2    |
|    4   |    1    |
|    4   |    2    |
+--------+---------+

然后程序突然发出错误的结果(+--------+---------+ | i | j | +--------+---------+ | 1 | 1 | | 1 | 2 | | 2 | 2 | +--------+---------+ ,而不是6

但至少可以说,这似乎违反直觉。变量72i变为0,在上面的示例中等于numOfGroups。另一方面,5j变为i,恰好是groupSize

应该有2次迭代,但只有5*2 = 10次迭代。此外,在最后一次迭代中,j应该“重新初始化”为3。但这不会发生。

debugger-screenshot

任何人都可以帮助这个C ++新手吗?

修改 问题是j-for-loop的范围从移动索引(0)到非移动索引(i)。这导致第二个for循环中的“缩小”效果,可以通过更改此行轻松修复:

groupSize

对另一个人:

for (int j = i; j <= groupSize; j++)

为了使完​​整算法按预期工作,还应该替换这些行:

for (int j = i; j <= i + groupSize - 1; j++)

这一个:

int numOfGroups = numStr.size() / groupSize;
int groupsRemaining = numStr.size() % groupSize;

编辑2 现在一切都好了,谢谢你们的善意!我很感激。整个代码是:

int numOfGroups = numStr.size() - 1;

1 个答案:

答案 0 :(得分:2)

你说:

另一方面,j从0变为groupSize

但代码说:

for (int j = i; j <= groupSize; j++)

这意味着j从i到groupSize,而不是0到groupSize

相关问题