利用辗转相除法计算最大公约数与最小公倍数
2015-09-17 15:50
183 查看
google的一道面试题目,两个数字m,n,其取值的范围为0~100000.怎么求这两个数的最大公约数与最小公倍数。
首先想到地就是辗转相除法来求解这道题目。
算法思想如下:
设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除以r2,……如此下去,直到能整除为止。其最后一个为被除数的余数的除数即为(a,
b)。例如:a=25,b=15,a/b=1......10,b/10=1......5,10/5=2.......0,最后一个为被除数余数的除数就是5,5就是所求最大公约数。
一般人会使用递归的方法进行计算,我采用非递归的方法来实现,完整的代码实现如下:
首先想到地就是辗转相除法来求解这道题目。
算法思想如下:
设两数为a、b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1)。若r1=0,则(a,b)=b;若r1≠0,则再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除以r2,……如此下去,直到能整除为止。其最后一个为被除数的余数的除数即为(a,
b)。例如:a=25,b=15,a/b=1......10,b/10=1......5,10/5=2.......0,最后一个为被除数余数的除数就是5,5就是所求最大公约数。
一般人会使用递归的方法进行计算,我采用非递归的方法来实现,完整的代码实现如下:
#include<iostream> #include<vector> using namespace std; int gcd(int m,int n) { int gcd_flag=1; int flag=1; int temp=0; if(m<n) { m=m+n; n=m-n; m=m-n; } if(m==0||n==0) { gcd_flag=0; flag=0; } while(flag) { temp=m%n; if(temp==0) { gcd_flag=n; flag=0; } else { m=n; n=temp; } } return gcd_flag; } int main() { int data1,data2; int gys,gbs; cin>>data1>>data2; gys=gcd(data1,data2); gbs=data1*data2/gys; cout<<"公约数:"<<gys<<"公倍数:"<<gbs<<endl; }递归的版本更加容易理解:
int gcd_recursion(int m,int n) { if(m<n) { m=m+n; n=m-n; m=m-n; } if(m%n==0) return n; else return gcd_recursion(n,m%n); }
相关文章推荐
- 输出组合排列的方案
- 【Code Forces 320C】【贪心+讨论】A Problem about Polyline 点在折线段上求最小的波浪长度
- git怎样删除未监视的文件untracked files
- 切图那点事
- Windchill的历史
- Effective Java学习笔记
- struts2文件上传
- 幸福是什么
- GirdView代码分析
- [JS插件] fullPage:适合移动端web整屏滚动组件
- 安畅亚太节点即将上线,战略布局海外市场
- [BLE--GAP]GAP Service及其使用
- Maven+Spring framework生成的可执行jar文件执行异常
- Effective C++ ——初始化
- Makefile使用总结
- GetComponentsInChildren(); 使用方法
- 输出全排列的方案
- linux yum命令详解
- APP开发中设计规范的重要性
- 注册表