求最小公倍数和最大公约数的方法
//书本第四章第01题,分别求出两个整数的最大公约数和最小公倍数,用主函数调用两个函数,并输出结果,两个整数由键盘输入。 /* 最小公倍数_--解法一 借助最大公约数求最小公倍数 步骤: 一、利用辗除法或其它方法求得最大公约数; 二、 最小公倍数等于两数之积除以最大公约数。 最小公倍数--解法二 质因数分解 举例:12和27的最小公倍数 12=2×2×3 27=3×3×3 必须用里面数字中的最大次方者,像本题有3和3的立方, 所以必须使用3的立方(也就是3*3*3),不能使用3 所以: 2×2×3×3×3=4×27=108 两数的最小公倍数是108 最大公约数原理 如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。 几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。 例: 在2、4、6中,2就是2,4,6的最大公约数。 早在公元前300年左右,欧几里得就在他的著作《几何原本》中给出了高效的解法——辗转相除法。 辗转相除法使用到的原理很聪明也很简单,假设用f(x, y)表示x,y的最大公约数, 取k = x/y,b = x%y,则x = ky + b, 如果一个数能够同时整除x和y,则必能同时整除b和y; 而能够同时整除b和y的数也必能同时整除x和y, 即x和y的公约数与b和y的公约数是相同的,其最大公约数也是相同的, 则有f(x, y)= f(y, y % x)(y > 0), 如此便可把原问题转化为求两个更小数的最大公约数, 直到其中一个数为0,剩下的另外一个数就是两者最大的公约数。 例如,12和30的公约数有:1、2、3、6,其中6就是12和30的最大公约数。 */ //第四章第01题,分别求出两个整数的最大公约数和最小公倍数,用主函数调用两个函数,并输出结果,两个整数由键盘输入。 #include<iostream> using namespace std; //辗转相除法 inline int gongyue(int x,int y) { int t; if(x>y)t=y,y=x,x=t; //将较大数赋给y,xy顺序调换 if(x!=0)gongyue(x,t=y%x);//辗转相除法及递归调用,[公约数(较小数,余数)] else return y; } int main() { //输入整数 cout<<"请输入两个整数并用空格间开:"; int a,b; cin>>a>>b;cout<<endl; //运算 int i=gongyue(a,b); cout<<"它们的最大公约数是:"<<i<<endl; i=a*b/i; cout<<"它们的最小公倍数是:"<<i<<endl; return 0; }