解题笔记(36)——最大公约数问题
来源:互联网 发布:淘宝卖家怎么设置会员 编辑:程序博客网 时间:2024/04/30 09:33
问题描述:求两个正整数的最大公约数。
思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法。通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) (x >=y > 0)。根据通式写出算法不难,这里就不给出了。这里给出《编程之美》上的算法,主要是为了减少迭代的次数。
对于x和y,如果y = k * y1, x= k * x1,那么f(x, y) = k * f(x1, y1)。另外,如果x = p * x1,假设p为素数,并且y % p != 0,那么f(x, y) = f(p * x1, y) = f(x1, y)。取p = 2。
参考代码:
//函数功能: 求最大公约数//函数参数: x,y为两个数//返回值: 最大公约数int gcd_solution1(int x, int y){if(y == 0)return x;else if(x < y)return gcd_solution1(y, x);else{if(x&1) //x是奇数{if(y&1) //y是奇数return gcd_solution1(y, x-y);else //y是偶数return gcd_solution1(x, y>>1);}else //x是偶数{if(y&1) //y是奇数return gcd_solution1(x>>1, y);else //y是偶数return gcd_solution1(x>>1, y>>1) << 1;}}}
下面非递归版本:
int gcd_solution2(int x, int y){int result = 1;while(y){int t = x;if(x&1){if(y&1){x = y;y = t % y;}elsey >>= 1;}else{if(y&1)x >>= 1;else{x >>= 1;y >>= 1;result <<= 1;}}}return result * x;}
- 解题笔记(36)——最大公约数问题
- 求一个数的最大公约数的三种思路——解题笔记
- 【C++解题报告】求最大公约数问题(辗转相除法)
- 解题笔记(14)——几个字符串的问题
- 解题笔记(10)——约瑟夫环问题
- 解题笔记(16)——几个数字的问题
- 解题笔记(21)——字符串的排列组合问题
- 解题笔记(22)——n后问题
- 解题笔记(26)——排队问题
- 解题笔记(29)——珠子问题
- 解题笔记(39)——过河问题
- 解题笔记(21)——字符串的排列组合问题
- 解题笔记(21)——字符串的排列组合问题
- 解题笔记(10)——约瑟夫环问题
- 解题笔记(21)——字符串的排列组合问题
- 解题笔记(16)——几个数字的问题
- 解题笔记(14)——几个字符串的问题
- 解题笔记(10)——约瑟夫环问题
- nRF24L01 MSP430 发送接收驱动程序
- 函数指针数组的使用(简单)
- 设计模式--装饰模式
- MTK平台屏幕切换机制探索--group机制(11A版本)
- 运算符
- 解题笔记(36)——最大公约数问题
- 对象序列化与随机文件
- 浅谈Android开机启动速度优化(含应用程序启动速度优化)
- C#程序发布(之后即可在其他电脑上运行)
- php调用mysql存储过程返回结果集的处理
- poj 1019 Number Sequence
- POJ3660 Cow Contest
- File类与热键的使用
- Android实现带动画效果的Tab Menu