码迷,mamicode.com
首页 > 其他好文 > 详细

玄学辗转相除法求GCD

时间:2019-01-27 22:09:59      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:返回   ...   pre   bsp   code   语句   因此   就是   拆分   

摘录自某位神仙的代码

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

标签:返回   ...   pre   bsp   code   语句   因此   就是   拆分   

原文地址:https://www.cnblogs.com/cgazn/p/10327636.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!