【发布时间】: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)
但这似乎违反直觉,至少可以这么说。变量i 从0 变为numOfGroups,在上面的示例中等于5。另一方面,j 从i 变为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 <= groupSize; j++),之后你应该考虑数组以0开头并以size()-1结尾。
标签: c++