代码改变世界

辗转相除法求最大公约数

2022-05-17 17:10  钟铧若岩  阅读(308)  评论(0编辑  收藏  举报

假设有两个数x和y,存在一个最大公约数z=(x,y),即x和y都有公因数z,
那么x一定能被z整除,y也一定能被z整除,所以x和y的线性组合mx±ny也一定能被z整除。(m和n可取任意整数)

对于辗转相除法来说,思路就是:
若x>y,设x/y=n余c,
则x能表示成x=ny+c的形式,
将ny移到左边就是x-ny=c,由于一般形式的mx±ny能被z整除,
所以等号左边的x-ny(作为mx±ny的一个特例)就能被z整除,
即x除y的余数c也能被z整除。
————————————————
版权声明:本文为CSDN博主「hello_woo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hello_woo/article/details/79293235

 

 

. 辗转相除法是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。这个和更相减损术有着异曲同工之处。
————————————————
版权声明:本文为CSDN博主「Demo龙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_59708493/article/details/121615282

 

 1 int gcd(int a, int b) 
 2 {
 3     int t;
 4      while(1) 
 5     {
 6           t=a%b;
 7           if(t==0)
 8           {
 9               return b;//如果a%b=0;b就是要求的最大公约数
10           }
11           a=b;//辗转替换
12           b=t;
13      }
14      return a;
15 }

 

1 //递归简化代码
2 int gcd(int a, int b) 
3 {
4     return a%b==0?b:gcd(b,a%b);//理解辗转相除法原理后可以轻易理解,辗转相除本身就是一种递归;
5 }