Problem A: 求两个整数的最大公约数和最小公倍数
Description
写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。
Input
两个数
Output
最大公约数 最小公倍数
#include <iostream>
using namespace std;
int main()
{
int n,m,gys,gbs;
int gcd(int a, int b);
int lcm(int a, int b);
cin>>n>>m;
gys=gcd(n,m);
gbs=lcm(n,m);
cout<<gys<<' '<<gbs<<endl;
return 0;
}
int lcm(int a,int b)
{
int h,l;
int gcd(int,int);
{h=gcd(a,b);
l=a*b/h;
return l;}
}
int gcd(int a,int b)
{
int s,t;
if(b>a)
{s=a;a=b;b=s;}
while((t=a%b)!=0)
{a=b;
b=t;}
return b;
}
这个题
目的难点在于求最大公约数和最小公倍数的数学方法,通常情况下,先用辗转相除法(用较大数除以较小数,再以较小数做被除数,得到的余数做除数,如此循环,直到得到的余数为0时,除数即上一步的余数就是最大公约数)求出最大公约数,在通过最大公约数间接求最小公倍数(两个数相乘,得到的积除以他们的最大公约数就可以得到最小公倍数);题目还考察自定义函数,对于自定义函数,如果自定义函数在主函数之后,那么主函数中要调用自定义函数,相反,如果自定义函数在主函数之前,那么主函数中不必调用自定义函数,直接用即可;
先自定义求最大公约数的函数(int gcd(int a,int b)),为了保证大数做被除数,小数做除数,当他们的位置相反时(if(b>a)),将他们换过来(s=a;a=b;b=s;),然后用辗转相除法求出最大公约数(while((t=a%b)!=0) {a=b; b=t;});
在求最大公约数的函数之前定义求最小公倍数的函数(int lcm(int a,int b)),所以要调用求最大公约数的函数(int gcd(int,int);),如果求最小公倍数的函数在求最大公约数的函数之后,就不用调用了;在调用完之后,求出两个数的最大公约数(h=gcd(a,b);),利用最大公约数求出最小公倍数(l=a*b/h;);
主函数在最前面(int main()),调用两个自定义函数(int gcd(int a, int b); int lcm(int a, int b);),输入数据之后(cin>>n>>m;),用自定义函数计算(gys=gcd(n,m); gbs=lcm(n,m););
按要求输出结果(cout<<gys<<' '<<gbs<<endl;)