最大公约数求解
来源:互联网 发布:centos 7 创建文件 编辑:程序博客网 时间:2024/06/07 06:27
《编程之美》
第一种方法(辗转相除法)
利用的原理:gcd(x,y)=gcd(y,x%y) //x>y,若x<y,则需要交换两者的位置
程序:
int gcd(int x,int y){//传入的参数要满足x>y
return (!y)?x:gcd(y.x%y);
}
缺点:在大整数时,取模运算会很昂贵
第二种方法(姑且成辗转相减法)
利用的原理:gcd(x,y)=gcd(x-y,y)
如果一个数能够同时整除x,y,则必能同时整除x-y,和y
int gcd(bigInt x,bigInt y){
if(x<y){
return gcd(y,x);
}
if(y==0){
return x;
}else{
return gcd(x-y,y);
}
}
第三种方法
原理:
对于y和x来说,如果y=k*y1,x=k*x1,那么有f(y,x)=k*f(y1,x1);另外,如果x=p*x1,假设p是素数,并且y%p!=0(即y不能被p整除),那么f(x,y)=f(p*x1,y)=f(x1,y)
取q=2
1.若x,y均为偶数,f(x,y)=2*f(x/2,y/2)=2*f(x>>1,y>>1)
2.若x为偶数,y是奇数 f(x,y)=f(x/2,y)=f(x>>1,y)
3.若x是奇数,y是偶数f(x,y) =f(x,y>>1)
4.若x,y均是奇数f(x,y)=f(y,x-y)
程序:
bigint gcd(bigint x,bigint y){
if(x<y)
return gcd(y,x);
if(y==0){
return x;
}else{
if(x%2==0){//x是偶数
if(y%2==0){
return gcd(x>>1,y>>1)<<1;
}else{
return gcd(x>>1,y);
}
}else{
if(y%2==0){
return gcd(x,y>>1);
}else{
return gcd(y,x-y);
}
}
}
}
- 最大公约数求解
- 最大公约数求解
- 最大公约数求解
- 最大公约数的求解
- 利用最大公约数求解问题
- 递归求解最大公约数...
- C++求解最大公约数编程
- 最大公约数,最小公倍数求解
- 递归求解最大公约数
- 欧几里德算法--求解最大公约数
- 【C语言】求解最大公约数
- 欧几里德算法求解最大公约数
- 使用Python求解最大公约数
- 【基本算法】求解最大公约数
- 用欧几里得算法求解最大公约数
- 求最大公约数 百钱买百鸡 求解多项式
- 如何求解最大公约数和最小公倍数
- 递归:最小公倍数和最大公约数求解
- iOS 中监听观察通知的几种方法
- 给程序员推荐提高工作效率的软件
- Java 内存分配全面浅析
- 基于连接池监控组件druid实现的监控用户在线状态
- jQuery绑定事件到动态创建的事件上
- 最大公约数求解
- POJ 3259 解题报告
- EasyUI combobox 使用
- A+B for Input-Output Practice (VIII)
- 仓库查询,下属库位条数的获取
- 图像处理实用资源
- Android图片格式转换
- Doing Homework again
- 当前应用拦截NFC响应,不弹出选择框教程