第一章 绪论 page 3 欧几里得算法求最大公约数:辗转相除法

       还记得最大公约数的定义吗?两个不全为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.

后面的连续整数检测算法和中学里计算,不提供实现,掌握一种求解应该就够了吧。有兴趣的可以自己了解一下。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值