|
发表于 2013-6-24 11:17:35
|
显示全部楼层
看这我,我已经详细的给出注释,再不懂你给我回复:
#include <stdio.h>
int main()
{
int p,r,n,m,temp;//n,m是输入变量,要求他们的最大公约数和就小公倍数,temp用于交换n和m的值使n>=m,
//p用于求最小公倍数
printf("请输入两个正整数n,m:");
scanf("%d,%d,",&n,&m);
if (n<m) //这个if实现了交换n和m的值,为什么要交换,因为要用到辗转相除法,肯定需要大数除小数
{
temp=n;
n=m;
m=temp;
}
p=n*m;//这是求最小公倍数,设最大公约数为k,这最小公倍数p=n*m/k,证明略,只需要记住公式,这是,你会问这个语句
//只有p=n*m,没有出k,这是因为最大公约数k还没求出来,只已知n和m,所以只做一部分工作,即先做乘法部分n*m
//然后赋值给p,待求出最大公约数,再除以最大公约数k,所以你会看到printf("它们的最小公倍数为:%d\n",p/n);
//而不是printf("它们的最小公倍数为:%d\n",p);
while(m!=0)//这个循环实现求最大公约数,用的是辗转相除法,还需要罗嗦嘛?好吧,不费口舌的再讲一下,设n和m的最大
{ //公约数为gcd(n,m),依据辗转相除法,有:gcd(n,m)=gcd(m,n%m);一直做这个过程直到n%m=0,即m=0;
r=n%m; //打个比方,n=8,m=6,则有:r=n%m=2,n=m=6,m=r=2再来一次r=n%m=0,n=m=2,m=r=0;这时,m=0,终止程序
n=m; //那么n就是最大公约数,我们验证一下确实也是,接下来的工作就是输出啦!
m=r;
}
printf("它们的最大公约数为:%d\n",n);
printf("它们的最小公倍数为:%d\n",p/n);
return 0;
}
|
|