这个 FOR-IF 循环的解释是什么?
What is explanation for this FOR-IF loop?
我正在用C++为GCD编写代码,但我遇到了一个神秘的错误,我似乎想不出它可能的原因。
在下面的程序中,如果两个数字都等于i
...它将中断并返回i
的值。
但它似乎不起作用,因为它将结果输出为1
.
int gcd2(int a, int b) {
int i,hcf=0;
if (b > a) {
a = a + b;
b = a - b;
a = a - b;
}
for (i = 1; i <= b; ++i) {
if (a % i == 0 && b % i == 0) {
break;
}
}
return i;
}
但是当我在同一代码中添加变量HCF时:
int gcd2(int a, int b) {
int i,hcf=0;
if (b > a) {
a = a + b;
b = a - b;
a = a - b;
}
for (i = 1; i <= b; ++i) {
if (a % i == 0 && b % i == 0) {
hcf = i;
}
}
return hcf;
}
它有效。为什么?谁能澄清一下?
变量hfc
不是您注意到差异的原因。如果我们保留差异但在两个版本中引入hfc
,我们将得到:
int hfc = 0;
for (i = 1; i <= b; ++i) {
if (some_condition(i)) {
hfc = i;
break; // breaks out of the loop
}
}
return hfc;
与
int hfc = 0;
for (i = 1; i <= b; ++i) {
if (some_condition(i)) {
hfc = i; // no break !!!
}
}
return hfc;
第一个返回some_condition(i)
true
的i
的第一个值。第二个版本返回some_condition(i)
true
的最后一个i
值。这一点以及任何数字都可以被1
整除的事实解释了您得到的不同结果。
两个样本之间的简单区别是循环是否遍历整个间隔,以及是返回第一个还是最后一个匹配项。
使用break
可以在找到满足条件的第一个数字时停止。正如评论者所指出的,1 是所有数字的除法符,所以你应该从i = 2
开始。然而,这种变体仍然不会在所有情况下找到最大的公约数。
另一方面,变量赋值可以多次调用,因此您的第二个样本返回最后一个样本,即找到的最大数字,这很可能是您想要的结果。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 这个 FOR-IF 循环的解释是什么?
- 有人能解释一下这些说法背后的逻辑是什么吗
- 是什么解释了这个片段中如此多的移动和破坏
- 在C++中使用 fread() 来解释这个结果是什么?
- 任何人都解释下面的代码,它的输出是什么?
- Deque的解释是什么,任何人都可以帮助我
- 解释"Bit String"的最佳方式是什么
- 有人能解释一下最多一次不变和存在、所有权和守恒规则是什么吗?
- 在OpenCV中,std::vector而不是cv::Mat的"type"是什么解释,我该如何更改它?(C++)
- 这个C++测验答案背后的解释是什么
- 请解释一下这个朋友声明是什么意思
- 解释gcov输出以提高覆盖率的技巧是什么
- 有人能详细解释一下cv和cv2的不同之处吗?是什么让cv2比cv更好更快?