惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
Stack Overflow Blog
Stack Overflow Blog
量子位
腾讯CDC
N
Netflix TechBlog - Medium
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
S
SegmentFault 最新的问题
A
About on SuperTechFans
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tailwind CSS Blog
G
Google Developers Blog
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
雷峰网
雷峰网
罗磊的独立博客
Vercel News
Vercel News
L
LangChain Blog
V
V2EX
P
Proofpoint News Feed
M
MIT News - Artificial intelligence
博客园 - Franky
V
Visual Studio Blog
J
Java Code Geeks

博客园 - maledong

如何通过反射调用扩展方法? JQuery学习笔记——nt-child的使用 - maledong - 博客园 ASP.NET专题研究——角色和Profile ASP.NET专题研究——用户登录、注册和发送密码 NET基本探究——事件 ASP.NET专题研究——登录权限 C#4.0和VS2010新特性(三) C#4.0和VS2010新特性(二) C#4.0和VS2010新特性(一) F# 快乐之旅(一)——F#尝鲜 MVC专题研究(五)——数据验证 MVC专题研究(四)——Html中的扩展方法 MVC专题研究(三)——数据绑定和传送 MVC专题研究(二)——神奇的URL MVC2专题研究(一)——用MVC组织管理您的家庭收入 典型算法及应用——“递归法”探究 ASP.NET专题研究——资源文件的使用 NET基本探究系列——委托 NET常见类系列探究——序列化和反序列化的应用
求最大公约数与最小公倍数的算法
maledong · 2010-05-23 · via 博客园 - maledong

(一)    最大公约数:

所谓“最大公约数”是指两个数(A和B)都能够被C整除,求这个C的最大值问题。在欧几里德的《几何原本》中记载着辗转相除的方法来解决此类问题。此问题的大致思路是:

假设存在A和B两个正整数(且A>B),那么令R= A % B,R和B分别取代原来的B和A,重复取余工作,直到R=0(表明那个A就是最大公约数)。

其一般算法(伪代码Pseudo Code)如下(A和B不能为0,且必需保证头一次输入A大于B,算法做了修补):

int GYS (int a, int b)

{

如果 (a<b)

{

a <=> b(交换)

}

循环

{

余数 = a % b

a = b

b = 余数

}满足条件 (余数<>0);

返回 a;

}

由于本题的a和b分别通过循环迭代到了自身(上一次的输出成为下一次计算的输入函数),所以可以简化成递归形式(A和B不能为0,且必需保证头一次输入A大于B,算法做了修补):

int GYS (int a, int b)

{

如果 (a<b)

{

a <=> b(交换)

}

如果 (b ==0) 返回a

否则 返回 GYS (b, a % b)

}

同样地,中国古老的《九章算学》中曾经有过一种叫做“辗转相减”的方法,其大致定义如下:

设有两个数(A,B)且A大于B,令 D = A - B,将D和B再次按照大小代入A和B中,由大数减去小数……这样辗转相减,直到A=B,此时A或者B就是最大公约数。

其一般算法如下(A和B不能为0,且必需保证头一次输入A大于B,算法做了修补):

int GYS (int a, int b)

{

循环条件满足 ( a<>b)

{

如果 (a<b)

{

a <=> b(交换)

}

a = a - b

}

输出a或者b都可

}

其同样满足递归的条件,现给出递归的一般式:

int GYS (int a, int b)

{

如果 (a<b)

{

a <=> b(交换)

}

如果 (a=b) 返回a或者b

否则 返回 GYS (a-b,b)

}

补充说一句:或许读者“惊奇”的发现,为什么一般算法对于欧几里德的而言不必将两个数大小调整放到循环体内,而对于中国的算法必须这样做?道理很简单:因为如果一开始A>B,那么A%B的余数肯定不会大于B,所以把B赋值给A,A% B的结果给B自然永远符合A>B的条件;但是A-B的差和B比较不一定B一定大于它,所以还要内部排序,直到满足条件(大数减小数,直到A=B为止)。

至于最小公倍数的求法,直接是两个数的乘积除以最大公约数的结果,这里就不给出具体代码了。