首先,我对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
)
但至少可以说,这似乎违反直觉。变量72
从i
变为0
,在上面的示例中等于numOfGroups
。另一方面,5
从j
变为i
,恰好是groupSize
。
应该有2
次迭代,但只有5*2 = 10
次迭代。此外,在最后一次迭代中,j应该“重新初始化”为3
。但这不会发生。
任何人都可以帮助这个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;
答案 0 :(得分:2)
你说:
另一方面,j从0变为groupSize
但代码说:
for (int j = i; j <= groupSize; j++)
这意味着j从i到groupSize
,而不是0到groupSize