当前位置: 代码迷 >> PB >> pb求最大公约数和最小公倍数的程序,该如何处理
  详细解决方案

pb求最大公约数和最小公倍数的程序,该如何处理

热度:133   发布时间:2016-04-29 08:44:56.0
pb求最大公约数和最小公倍数的程序
设计一个界面并编写相应脚本,要求输入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);
}
 
  相关解决方案