1. 程式人生 > >玄學輾轉相除法求GCD

玄學輾轉相除法求GCD

正常的 條件 實現 核心 code wap 因此 執行 return

摘錄自某位神仙的代碼

短短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