您的位置:首页 > 其它

求最大公约数与最小公倍数

2018-01-12 16:12 190 查看
求最大公约数与最小公约数

求最大公约数(辗转相除法||二进制)和最小公倍数

辗转相除法:

1.求t=a%b;

2.if(t!=0) m=n,n=t,重复1(调用子程序);

3.if(t==0) 终止子程序;

4.输出此时b值;

二进制法:(适合高精度)

1.终止条件:gcd(a,a)=a;(a==b)

2.关系式:

case a < b :gcd(a,b)=gcd(b,a);

case 同偶 :gcd(a,b)=2*gcd(a/2,b/2);

case a偶b奇 :gcd(a,b)=gcd(a/2,b);

case a奇b偶 :gcd(a,b)=gcd(a,b/2);

case a奇b偶 :gcd(a,b)=gcd(a,b-a);

code:

#include<cstdio>
using namespace std;
int gcd(int a,int b){    //辗转相除法
//    if(a%b==0)  return b;
//    else   return gcd(b,a%b);

return !b?a:gcd(b,a%b);

}
int lcm(int a,int b){
return a*b/gcd(a,b);    //最小公倍数乘最大公约数等于它们的乘积
}
int main(){
int a,b,t;
scanf("%d%d",&a,&b);

//    if(a<b)   {t=a;a=b;b=t;}

t=gcd(a,b);
printf("%d %d",t,a*b/t);
return 0;
}


二进制(适合高精):

#include<cstdio>
using namespace std;
int gcd(int a,int b){
if(a==b) return a;      //递归终止条件
if(a<b) return gcd(b,a);
if(a&1){
if(b&1) return 2*gcd(a>>1,b>>1);
else return gcd(a>>1,b);
}
else{
if(b&1) return gcd(a,b>>1);
else return gcd(b,a-b);
}
}
int lcm(int a,int b){
return a*b/gcd(a,b);    //最小公倍数乘最大公约数等于它们的乘积
}
int main(){
int a,b,t;
scanf("%d%d",&a,&b);
t=gcd(a,b);
printf("%d %d",t,a*b/t);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: