最大公约数问题
来源:互联网 发布:搞笑网络歌曲 编辑:程序博客网 时间:2024/06/06 09:20
解法一:欧几里得的辗转相除法。f(x,y)=f(y,x%y),f(a,b)表示a,b最大公约数。
int gcd(int x,int y){
return (!y)?x:gcd(y,x%y);
}
解法二:对于大数而言,取模运算(其中用到除法)是非常昂贵的开销。用辗转减法:f(x,y)=f(x-y,y),这边需要注意的是要维持左边的数大于右边的数。
解法三:(1)对于y和x来说,如果y=k*y1,x=k*x1.那么有f(y,x)=k*f(y1,x1)。(2)如果x=p*x1,假设p是素数(必须要保证y与p最大公约数为1),并且y%p!=0(即y不能被p整除),那么f(x,y)=f(p*x1,y)=f(x1,y)。因此可以用2这个素数来进行求解:
取p = 2
若x,y均为偶数,f(x,y)=2*f(x/2,y/2)=2*f(x>>1,y>>1)
若x为偶数,y为奇数,f(x,y)=f(x/2,y)=f(x>>1,y)
若x为奇数,y为偶数,f(x,y)=f(x,y/2)=f(x,y>>1)
若x,y均为奇数,f(x,y)=f(y,x-y),那么在f(x,y)=f(y,x-y)之后(这边f中也要维护左边的数大于右边的数),(x-y)是一个偶数,下一步一定会有除以2的操作。
该方法最坏情况下的时间复杂度是O(log2(max(x,y)))。(移位是个很好的操作,切记)- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 最大公约数问题
- 二叉树遍历大杂烩(递归,非递归)
- 哈夫曼树的创建以及冒泡排序法的应…
- HuffmanTree 改进
- 折半法的简单应用
- 内存管理
- 最大公约数问题
- 异或的性质及运用
- android 随手记 sqlite使用
- 关于if(!cin)
- explicit构造函数
- 100的阶乘
- 我和你一样,一样的坚强
- TCP长连接与短连接的区别
- Gamma函数