还记得最大公约数的定义吗?两个不全为0的非负正数 m 和 n 的最大公约数记为 gcd(m,n),代表能够整除(即余数为0)m和n的最大正整数。
gcd(m,n) = gcd(n,m mod n)
m mod n 表示m除以n之后的余数。
下面是一个结构化的描述:
第一步:如果 n = 0,返回 m 的指作为结果,同时过程结束;否则,进入第二步。
第二步:m 除以 n ,将余数赋给 r 。
第三步:将 n 的值赋给 m ,将 r 的值赋给 n ,返回第一步。
伪代码描述:
算法 Euclid(m,n)
while n ≠ 0 do
r ← m mod n
m ← n
n ← r
return m
直接上代码,上面的伪代码采用while循环方式,笔者使用递归实现:
int ChapterOne::gcd(int m, int n)
{
if (n == 0)
return m;
int r = m % n;
m = n;
n = r;
return gcd(m, n);
}
没有检查输入的条件 m > n.
后面的连续整数检测算法和中学里计算,不提供实现,掌握一种求解应该就够了吧。有兴趣的可以自己了解一下。