求最大公约数的两种方法(c语言)

您所在的位置:网站首页 求两个正整数的最大公约数c语言程序代码 求最大公约数的两种方法(c语言)

求最大公约数的两种方法(c语言)

2024-07-12 07:50| 来源: 网络整理| 查看: 265

一.辗转相除法

1.来源背景 辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求两个正整数之最大公约数的算法。它是已知最古老的算法, 其可追溯至公元前300年前。

2.思路分析 用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。 (两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数)

3.数学证明 设两数为a、b(a>b),用gcd(a,b)表示a,b的最大公约数,r=a (mod b) 为a除以b的余数,k为a除以b的商,即a÷b=kr。辗转相除法即是要证明gcd(a,b)=gcd(b,r)。 第一步:令c=gcd(a,b),则设a=mc,b=nc 第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c 第三步:根据第二步结果可知c也是r的因数 第四步:可以断定m-kn与n互质(假设m-kn=xd,n=yd (d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)cd,b=nc=ycd,则a与b的一个公约数cd>c,故c非a与b的最大公约数,与前面结论矛盾),因此c也是b与r的最大公约数。 从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。 证毕。 以上步骤的操作是建立在刚开始时r≠0的基础之上的。即m与n亦互质。

4.代码分析(c语言)

#include int main() { int num1,num2; int r; scanf("%d%d",&num1,&num2); if(num2>num1) //保证num1>num2 { r=num2; //如果num2>num1,交换变量,使num2num2) num1=num1-num2;//以较大的数减较小的数 else num2=num2-num1;//以较大的数减较小的数 } c=pow(2,i)*num1;//求第一步中约掉的若干个2与第二步中等数的乘积 printf("%d",c); }

三.注意 1.比较 更相减损术和辗转相除法的主要区别在于前者所使用的运算是"减",后者是"除"。从算法思想上看,两者并没有本质上的区别,但是在计算过程中,如果遇到一个数很大,另一个数比较小的情况,可能要进行很多次减法才能达到一次除法的效果,从而使得算法的时间复杂度退化为O(N),其中N是原先的两个数中较大的一个。相比之下,辗转相除法的时间复杂度稳定于O(logN)。

2.最小公倍数的求法 可用两数之积除以两数最大公因数

在这里插入图片描述

//本文部分内容参考360百科



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3