求最小公倍数和最大公约数的方法

//书本第四章第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;
}


 

posted on 2012-03-19 22:24  1.曲待续  阅读(747)  评论(0编辑  收藏  举报

导航