玄学辗转相除法求GCD

Posted cgazn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了玄学辗转相除法求GCD相关的知识,希望对你有一定的参考价值。

摘录自某位神仙的代码

短短5行的gcd, 核心只有两行

in int gcd(int a,int b)
{
    while(b^=a^=b^=a%=b);
    return a;
}

我们知道%=优先级高于位运算^=
因此while中的语句可拆分为:
a%=b;   b^=a^=b^=a;  
而同优先级的运算是从右往左的, 又可以拆成:

a%=b;  
b^=a;  
a^=b;  
b^=a;  

a%=b;  
swap(a,b);  

因为b^=...等缩写的运算会返回运算后的b值, 所有while中的一坨返回的是b的值, 那么执行条件就是b!=0

while(b!=0)  
{  
    a%=b; //运算后a<b  
    swap(a,b); //要保证a中的值始终比b大  
}  

也就等同于正常的循环实现辗转相除大法




以上是关于玄学辗转相除法求GCD的主要内容,如果未能解决你的问题,请参考以下文章

『数论』求最大公因数

求最大公约数(GCD)的两种算法

[算法]求满足要求的进制(辗转相除(欧几里得算法),求最大公约数gcd)

辗转相除求最大公约数

谁来解释一下用辗转相除法求最两个数的最大公约数原理

GCD三部曲之一---辗转相除法