求最大公约数与最小公倍数
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:
二进制(适合高精):
求最大公约数(辗转相除法||二进制)和最小公倍数
辗转相除法:
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; }
相关文章推荐
- 求最大公约数和最小公倍数
- 用欧几里得算法实现两个数的最大公约数和最小公倍数
- 最大公约数和最小公倍数
- 求最大公约数和最小公倍数
- 求两个数的最大公约数和最小公倍数
- 两个整数的最大公约数和最小公倍数
- 求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法
- 求两个或N个数的最大公约数和最小公倍数
- java作业:两个数字的最大公约数和最小公倍数
- 求最大公约数和最小公倍数---调用函数
- 最大公约数和最小公倍数
- 1012 最大公约数和最小公倍数问题
- 求最大公约数和最小公倍数(辗转相除法)
- WV.41-两个整数的最大公约数和最小公倍数
- 求最大公约数和最小公倍数(2013-06-11)
- 洛谷1029 最大公约数和最小公倍数问题 解题报告
- 求最大公约数和最小公倍数
- 【杭电-oj】-1108-最小公倍数(先辗转相除找到最大公约数)
- 欧几里得辗转相除求最大公约数最小公倍数
- 求若干整数的最大公约数和最小公倍数