解题思路以及注意事项:

  1. 小方是自己定义了gcd()函数来求最大公因数(最大公因数就是像12和18的最大公因数是6,两数除它都是整除)。

  2. gcd()函数用到了函数的递归调用,可能相对有点难想,但这个理解了可以背下来。

  3. gcd()的原理我们用个例子来说明,12和18。18-12=6 12-6=6 6=6 所以6就是最大公因数。

  4. 利用最大公因数和最小公倍数(能够同时被两个数整除的数 如12 18的最小公倍数是36)的关系来求最小公倍数 :最大公因数X最小公倍数=两数值积,如6X36=18X12。

  5. 定义lcm()函数来求最小公倍数,相信大家利用上面的公式可以理解。

  6. 函数声明别忘了。

实例代码:

#include"stdio.h"
int gcd(int a,int b);//函数声明
int lcm(int a,int b);//函数声明
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("%d %d",gcd(a,b),lcm(a,b));
    return 0;
} 
int gcd(int a,int b)
{
    if(b==0)
        return a;
    return gcd(b,a%b);//递归调用
}
int lcm(int a,int b)
{
    return a/gcd(a,b)*b;//利用公式
}

看看大家还有什么不懂的,请在下方的评论区留言

点赞(63)
 

0.0分

79 人评分

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

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

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

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

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

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

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

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

评论列表 共有 66 条评论

地中海旅游达人 5年前 回复TA
#include <stdio.h>
int main()
{
   int m ,n ,max,min,i,t;
   scanf("%d%d",&m,&n);
    for(i=m*n;i>=m;i--)
       {
           if(i%m==0&&i%n==0);
           min=i;
           }
           printf("%d",min);
   for(t=1;t<=m;t++)
   {
       if(n%t==0&&m%t==0)
       max=t;
   }
   printf("%d",max);
   return 0;
   
}能帮我看看哪里出问题了吗?
南风吹彻 5年前 回复TA
#include<stdio.h>
int main()
{
    int a,b,c=1,t,m;
    scanf("%d %d",&a,&b);
    int i; 
    for(i=2;i<a+1&&i<b+1;i++)
    {
        if(a%i==0&&b%i==0)
        c=i;
    }
    t=c>=1?c:1;
    m=a*b/t;
    printf("%d %d",t,m);
    return 0;
}
MJy 5年前 回复TA
//输入两个正整数a和b,求其最大公约数和最小公倍数。
#include <stdio.h>
int main()
{
	int f1(int x, int y);
	int f2(int p, int q, int z);
	int a = 0, b = 0;
	scanf("%d %d", &a, &b);
	int m = a > b ? a : b,    n = a > b ? b : a;
	printf("%d ", f1(m, n));
	printf("%d", f2(m, n, f1(m, n)));
}
int f1(int x, int y)
{
	int alter;
	while (x % y != 0)
	{
		alter = x % y;
		x = y;
		y = alter;
	}
	return y;
}
int f2(int p,int q,int z)
{
	return p * q / z;
}
114514 5年前 回复TA
#include<stdio.h>
int main()
{
    int a,b,max,min,i;
    int m,n;
    scanf("%d %d",&a,&b);
    if(a>b){
        max=a,min=b;
    }else{
        max=b,min=a;
    }
    i=max%min;
    while(i!=0){
        max=min;
        min=i;
        i=max%min;
    }
    n=max%min;
    m=a*b/n;
    printf("%d %d",n,m);
    return 0;
}
能帮我看看为什么我的这个不行吗
chengyuyi 5年前 回复TA
@chengyuyi int main()   /*  辗转相除法求最大公约数 */  {     int m, n, a, b, c,x,y,e,f;    scanf("%d%d", &a, &b);    m=a;   n=b;     if(a>b)   { x=a;y=b;}    else    {x=b;y=a;}    while(y!=0)  /* 余数不为0,继续相除,直到余数为0 */     { c=x%y; x=y;  y=c;}    printf("The largest common divisor:%d
", x);    printf("The least common multiple:%d
", m*n/x); }咋还是答案错误
chengyuyi 5年前 回复TA
@chengyuyi 写错了
chengyuyi 5年前 回复TA
#include"stdio.h"
int main()   /*  辗转相除法求最大公约数 */
 { 
   int m, n, a, b, c,x,y;
   scanf("%d%d", &a, &b);
   m=x;   n=y;
   if(a>b)
  { x=a;y=b;}
   else
   {x=b;y=a;}
   while(y!=0)  /* 余数不为0,继续相除,直到余数为0 */ 
   { c=x%y; x=y;  y=c;}
   printf("The largest common divisor:%d\n", x);
   printf("The least common multiple:%d\n", m*n/x);
}
19rj545 5年前 回复TA
唉唉唉唉唉,为什么写代码总是不加注释,这叫我们怎么看懂呐,唉唉唉
菜鸟杀手 5年前 回复TA
@努力再努力 你循环的条件应该是gy!=0吧
罗帅帅 5年前 回复TA
#  include <stdio.h>
int main (void)
{
    int a ,b ;
    int i ,t, x ,y ;

    printf ("输入两个值a、b,中间用空格隔开,将会输出这两个数的最大公约数和最小公倍数:");
    scanf("%d %d",&a ,&b);
   if (a<b)
    t = a;
   else
    t = b ;


    for (i=1;i<=t;++i)
    {
       if( (a%i == 0)  &&   (b%i ==0 )  )
           x=i ;

    }
    y =(a/x)*(b/x)*x ;

    printf("%d\n",x);
    printf ("%d\n",y) ;






    return 0 ;
}
我看不懂 呢些函数  还没学到    我觉得我这个也 可以