题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
1.程序分析:利用辗除法。
2.上代码:
#include <stdio.h>
//程序分析:利用辗除法。
int main()
{
int a,b,num1,num2,temp;
printf("please input two number:\n");
scanf("%d%d",&num1,&num2);
if(num1<num2){
temp = num1;
num1 = num2;
num2 = temp;
}
a = num1;
b = num2;
while(b!=0){ /*利用辗除法,直到b为0为止*/
temp = a%b;
a=b;
b=temp;
}
printf("公约数:%d\n",a);
printf("公倍数:%d\n",num1*num2/a);
}
何为辗转相除法?
(以下来自百度百科)
辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
结合辗除法和代码,总结一下:
1.先比较两个数的大小,较大者做分母,假设是b,较小者做分子,假设是a,此时会有一个余数,假设是temp
2.用步骤1得到的余数temp除分母b,也就是b/temp。此时会又有“第二个余数”temp2
3.用第二余数temp2除第一余数temp,也就是temp/temp2
注意:以上操作是求余数,所以用取余%法。
4.重复步骤1,2,3,知道最后的余数是0结束。
再来一次代码:
#include <stdio.h>
//程序分析:利用辗除法。
int main()
{ int a,b,num1,num2,temp;
printf("please input two number:\n");
scanf("%d%d",&num1,&num2);
if(num1<num2)//比较大小,大做分母,小做分子
{ temp = num1;//这是两个数比大小的经典算法
num1 = num2;
num2 = temp;
}
a = num1;//小者给a
b = num2;//大者给b
while(b!=0)/*利用辗除法,直到b为0为止*/
{ temp = a%b;//这是重复取余的操作
a=b;
b=temp;
}
printf("公约数:%d\n",a);
printf("公倍数:%d\n",num1*num2/a);
}