【发布时间】:2016-05-07 20:43:49
【问题描述】:
我正在尝试使用 C 中的欧几里德算法(递归)找到两个数字的 GCD,我确实知道它在数学上并不完全完美,因为它忽略了负数条件,但我只希望这个适用于正数暂时。
#include <stdio.h>
int gcd(int m, int n);
int main() {
return gcd(60, 24);
}
int gcd(int m, int n) {
if (m < n) {
//swapping both a and b
m = m + n;
n = m - n;
m = m - n;
}
if (m == n) {
return m;
} else {
return gcd(n, m % n);
}
}
【问题讨论】:
-
你的终止条件不够宽泛;并不总是最终 m==n 在(实际)算法结束时成立。示例帮助(例如 gcd(4, 2) -> gcd(2, 0)...)
-
是的,这是真的,但是对于所有正数,它最终都归零,除了我想知道的要点是为什么这个程序不能为 gcd(60,24) 运行如果我们遵循欧几里德的算法,我很确定它会归零。
-
嗯,(60, 24) -> (24, 12) -> (12, 0)。你的算法继续。这很糟糕......
-
大多数情况最终会到达
(m, 0)作为最终迭代。此时,它需要返回m。相反,它将尝试评估m % 0,这当然会导致错误。将m == n条件更改为n == 0以修复它。 -
感谢 Pachelbel 和 @Tom Karzes 非常感谢。尽管我保留了 m==n 条件来停止让程序进入计算,因为很明显如果 m==n 时 gcd 将是 m。所以我将只添加另一个检查 if(n==0) 而不是仅仅替换 m==n if 语句。谢谢。 :D
标签: c algorithm function recursion greatest-common-divisor