【问题标题】:Strange behaviour in nested For Loops嵌套 For 循环中的奇怪行为
【发布时间】:2017-10-10 13:13:14
【问题描述】:

首先,我对 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-相邻数字的最大乘积,一个大的给定数字numStr )。

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

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

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

+--------+---------+
|   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,而不是72

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

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

有人请帮助这个 C++ 新手吗?


编辑 问题在于 j-for-loop 的范围从移动索引 (i) 到非移动索引 (groupSize)。这导致了第二个 for 循环中的“收缩”效果,通过更改这一行很容易解决:

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;

只有这一个:

int numOfGroups = numStr.size() - 1;

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

int LargestProduct (string numStr, int groupSize) {
    int numOfGroups = numStr.size() - 1;
    int largestProduct = 0, thisProduct = 1;

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

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

        if (thisProduct > largestProduct)
            largestProduct = thisProduct;

        thisProduct = 1;
    }
    return largestProduct;
}

【问题讨论】:

  • 数组索引从 0 开始。
  • 谢谢@manni66,我知道但犯了错误。然而这并不能解决问题。现在程序生成2 而不是6,仅此而已。
  • "在最后一次迭代中,j 应该“重新初始化”为 0" - 为什么应该这样做?你的代码的哪一部分告诉它?
  • 为什么投反对票?
  • 你的意思是for (int j = 1; j &lt;= groupSize; j++),之后你应该考虑数组以0开头并以size()-1结尾。

标签: c++


【解决方案1】:

你说:

另一方面,j 从 0 变为 groupSize

但是代码说:

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

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

【讨论】:

  • @JoseLopezGarcia 你真的确定这些词是错误的而不是代码吗?这与您对 j 在 1 和 2 之间切换的期望相矛盾。
  • @nwp 和史蒂夫你都是对的。我的话是对的,代码是错误的!我将删除这个问题,因为它的布局似乎非常糟糕,它已经得到了 4 票反对。一些建议下次不要获得很多反对意见?我试图尽可能清楚地阐述问题,在其背后表现出一些关注和努力。谢谢
  • 如果您觉得它回答了您的问题,请随时将其标记为答案 :) 至于否决票,我不能说 - 我的似乎没有太大问题眼睛,但我自己在这里并不是特别有经验。
  • @JoseLopezGarcia imho 这个问题的一个问题是代码和您的期望都是错误的。一般来说,它有助于提供可以被其他人编译和运行的代码(你缺少一个 main)。并且不要太担心否决票。你关心的是解决问题,而不是代表,对吧?
  • 是的@tobi303,但是再多两三个,我将被禁止要求终身。这很难过,但我下次会做得更好。
猜你喜欢
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多