求最大公约数问题

来源:百度知道 编辑:UC知道 时间:2024/06/04 19:51:02
题目:输入m,n,求最大公约数和最小公倍数。
程序:
#include <stdio.h>
main()
{
int p,r,n,m,temp;
printf("please input two number:");
scanf("%d%d",&n,&m);
if(n<m)
{
temp=n;
n=m;
m=temp;
}
p=n*m;
while(m!=0)
{
r=n%m;
n=m;
m=r;
}
printf("zuidagongyueshu:%d\n",n);
printf("zuixiaogongbeishu:%d\n,p/n);
}提问:为什么要有while(m!=0)前提条件呢?

while(m!=0)
{
r=n%m;/*这里是将得到的余数给r,说明r终有一次会为0*/
n=m; /*因为这里在进行交换*/
m=r; /*这里将得到的r给m,说明m也一定会有一次会为0*/
}
如果你m!=0那么就是说无法退出循环,即死循环,上面的叫辗转相除法.
另外此T也可以用一班的数学方法,一班经过模拟运行后就知道他是如何完全功能的了,这里就不多说了!
解:源程序如下:
int gys (int x,int y)
{
int j;
j=(x<y)?x:y;
for(;j>0;j--)
if(x%j==0&&y%j==0)
break;
else
continue;
return (j);
}
int gbs (int z,int w)
{
int i;
i=(z>w)?z:w;
for(;i<=z*w;i++)
if(i%z==0&&i%w==0)
break;
else
continue;
return (i);
}
main()
{
int m,n;
clrscr();
printf("input n,m(n>0,m>0):");
scanf("%d%d",&n,&m);
printf("max gys is:%d\n",gys(n,m));
printf("min gbs is:%d\n",gbs(n,m));
}


n1%m1 == 0

说明n1能整除m1

说明m1是n1的最小公约数

你看循环体中
r=n%m;
n=m;
m=r;