1.求最小公倍数
利用两个数都可以被其整除的性质:最小公倍数可以从a的倍数和b的倍数中寻找,我们从大的数的倍数中寻找效率较高。
2.求最大公约数
1.穷举法
两个数的最大公约数必然是小于等于最小的数的,故从最小的数开始每次1开始寻找能同时整除两个数的,找到为止,即为最大公约数。
2.相减法
利用如下性质:

3.欧几里得辗转相除法
完整的代码如下:
#include<stdio.h>
/*-----最小公倍数,最大公约数-----*/
/*求最小公倍数,利用两个数都可以被其整除的性质
最小公倍数可以从a的倍数和b的倍数中寻找,
我们从大的数的倍数中寻找效率较高
*/
int MinCommonMultiple(int a,int b){
int mcm,temp;
if(a>b){//使a<b
temp=a;
a=b;
b=temp;
}
mcm=b;//msm为最大的数
while(mcm%a!=0){
mcm+=b;//msm%b==0必成立
}
return mcm;
}
/*函数功能:使用穷举法,求最大公约数:
利用两个数都可以整除公约数的性质
*/
int MaxCommonFactor(int a,int b) {
int temp,mcf;
if(a>b){//使a<b
temp=a;
a=b;
b=temp;
}
mcf=a;//mcf是最小的
while(a%mcf!=0||b%mcf!=0){
mcf--;
}
return mcf;
}
/*函数功能:使用相减法,求正整数的最大公约数
函数返回最大公约数,-1表示没有最大公约数
*/
int MaxCommonFactor1(int a,int b){
if(a<=0||b<=0) {
return -1;
}
while(a!=b){
if(a>b){
a=a-b;
}
else if(b>a){
b=b-a;
}
}
return a;
}
/*函数功能:使用辗转相除法,求正整数的最大公约数
函数返回最大公约数,-1表示没有最大公约数
*/
int MaxCommonFactor2(int a,int b){
int r;
if(a<=0||b<=0) {
return -1;
}
do{
r=a%b;//即使a<b,最后也会交换过去使a>b
a=b;
b=r;
}while(r);//r!=0,程序结束时b=0;
return a;
}
int main(void){
int a,b,mcm,mcf,mcf1,mcf2;
scanf("%d %d",&a,&b);
mcm=MinCommonMultiple(a,b);
mcf=MaxCommonFactor(a,b);
mcf1=MaxCommonFactor1(a,b);
mcf2=MaxCommonFactor2(a,b);
printf("mcm=%d\n",mcm);
printf("mcf=%d\n",mcf);
printf("mcf1=%d\n",mcf1);
printf("mcf2=%d\n",mcf2);
return 0;
}
3481

被折叠的 条评论
为什么被折叠?



