设计一个界面并编写相应脚本,要求输入2个正数,求它们的最大公约数和最小公倍数?
------解决方案--------------------
最大公约数和最小公倍数2010-01-03 17:25一、定义
同时能整除若干个整数的自然整数称为这若干个数的公约数,其中最大的公约数称为“最大公约数”。
同时是若干个自然整数的倍数称为这若干个数的公倍数,其中最小的公倍数称为“最小公倍数”。
二、定理
最小公倍数等于这些数之积除以最大公约数的商。
三、程序设计中两个数a和b的最大公约数与最小公倍数算法的实现。
设最大数为m,最小数为n,下面列举几种解法:
1、方法一:计算机中常用的穷举法
submul(int m,int n)
{
int i,residue;
for(i=1;i<n;i++)
if(m%i==0&&n%i==0)residue=i;
return residue;
}
点评:这种算法较为简单,两个数的最大公约数必定在1到最小数之间。故可使用循环判断1到最小数之间的每一个数是否为他们的约数,找到的最后一个约数必是最大的公约数。
2、方法二:辗除法
submul(int m,int n)
{
int residue;
while(residue=m%n)
{
m=n;
n=residue;
}
return n;
}
点评:这是数学方法,令大数为m,小数为n,若其余数residue不为0,则m=n,n=其余数,继续直到余数为0,则最后一次n的值为最大公约数。
例如:求4453和5767的最大公约数时,可作如下除法.
5767÷4453=1余1314
4453÷1314=3余511
1314÷511=2余292
511÷292=1余219
292÷219=1余73
219÷73=3
于是得知,5767和4453的最大公约数是73.
显然,第二种方法更优一些,第一种方法要算n次,而第二种只需几次。
得到最大公约数后,算出最小公倍数则很容易了:a*b/最大公约数。
3、方法三:更相损减法
《九章算术·方田》作分数约简时,提到了该方法:反复将两数中的较大者减去较小者,直到两数相等。这时候这个数就是最大公约数。这与辗除法是类似的。只不过将除换成了减。
这次使用函数递归的方式求解,为节省篇幅,请同学们自己举一反三整体思考。
submul(int m,int n)
{
if(m-n>n)return submul(m-n,n);
else if(m==n)return m;
else return submul(n,m-n);
}
完整的程序代码:
submul(int m,int n)
{
if(m-n>n)return submul(m-n,n);
else if(m==n)return m;
else return submul(n,m-n);
}
main()
{
int a,b,submultiple,multiple;
scanf("%d%d",&a,&b);
submultiple=a>b?submul(a,b):submul(b,a);
multiple=a*b/submultiple;
printf("%d %d\n",submultiple,multiple);
}