解题思路:

注意事项:

参考代码:


 方法一:


#include <stdio.h>


/*

输入两个正整数m和n,求其最大公约数和最小公倍数。

*/


int m1011(){

int m,n;

int mm=0,ss=0,t1,t2;

scanf("%d %d",&m,&n);

if(m%n==0){

mm=n;

ss=m;

}

else if(n%m==0){

mm=m;

ss=n;

}

else{

t1=(m<n)?m:n;

t2=(m>n)?m:n;

for(int i=t1/2;i>0;i--){

if(m%i==0 && n%i==0)

{

mm=i;

break;

}

}

for(int i=2;i<t2;i++){

if(t2*i%t1==0){

ss=t2*i;

break;

}

}

}

printf("%d %d\n",mm,ss);

return 0;

}


方法二:


/*

短除法:

12/1=12 18/1=18 ......1

12/2=6 18/2=9 ......2

6/3=2 9/3=3 ......3

最大公约数:1*2*3=6

最小公倍数:2*3*1*2*3=36 

*/

int m1011_2(){

int m,n,mm,ss;

int gcd=1;//最大公约数 

scanf("%d %d",&m,&n);

mm=m>n?m:n;

ss=m<n?m:n;

if(mm%ss==0){

printf("%d %d",ss,mm);

}

else

{

for(int i=ss/2;i>0;i--){

if(m%i==0 && n%i==0){

m/=i;

n/=i;

gcd*=i;

}

}

printf("%d %d",gcd,m*n*gcd);

return 0;


方法三:


/*

辗转相除法(欧几里得算法):

例1:

18/12=1 ......6

12/6=2 ......0

最大公约数:6

最小公倍数:18*12/6=36

例2:

9/6=1 ......3

6/3=2 ......0

最大公约数:3

最小公倍数:9*6/3=18

例3:

7/5=1 ......2

5/2=2 ......1

2/1=0 ......0

最大公约数:1

最小公倍数:7*5/1=35

例4:

90/15=6 ......0

最大公约数:15

最小公倍数:90*15/15=90 

*/

int Gcd(int m,int n){

return (m%n==0)?n:Gcd(n,m%n);

}


int m1011_3(){

int m,n;

int gcd=1;

scanf("%d %d",&m,&n);

//gcd=Gcd(m>n?m:n,m<n?m:n);

gcd=Gcd(m,n);

printf("%d %d",gcd,m*n/gcd);

return 0;

}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论