gcd算法整合(最大公约数)

来源:互联网 发布:xfplay 怎么没有mac版 编辑:程序博客网 时间:2024/05/18 11:47

最大公约数指某几个整数共有因子中最大的一个。

关于最大公约数的算法有很多,我就写出目前我所知道的算法吧~

int gcd(int a,int b){while(a!=b){if(a>b)a-=b;elseb-=a;}return a;}/*可用数学归纳法证明*/
辗转相除法(欧几里德算法)

int gcd(int a,int b){if(b==0)return a;return gcd(b,a%b);}//用递归做

int gcd(int a,int b){int c;while(b){c=a%b;a=b;b=c;}return a;}//用循环做

int gcd(int a,int b){while(b^=a^=b^=a%=b);//这样写是不正确的,因为这样写在不同的编译器上又可能结果不同return a;//这样写的格式是我从百度上看到的,思路和辗转相除一样,正确的完整写法看下面}
int gcd(int a,int b){while(b){a%=b;b^=a;//这样写就是上面的分部写法a^=b;//因为不这样写的话是会引起错误的,好像叫未定义行为b^=a;//而分部写的话就不会出现这种错误}return a;}


int gcd(int a,int b){//这是优化过的算法,是网上看到的,网址如下http://www.cppblog.com/CodePanada/archive/2011/05/19/146743.htmlif(a<b)return gcd(b,a);if(b==0)return a;if(a%2)//分成了奇偶两种情况{if(b%2)return gcd(b,a-b);elsereturn gcd(a,b>>1);}else{if(b%2)return gcd(a>>1,b);elsereturn 2*gcd(a>>1,b>>1);}}


0 0
原创粉丝点击