C语言经典算法【每日一练】08

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

公式法:最小公倍数=(m * n )/max(gys)

#include<stdio.h>
//最小公倍数
int main() {
    int minMultiple, m, n;
    scanf("%d %d", &m, &n);
    if (m > n) minMultiple= m;
    else minMultiple = n;
    while (1)
    {
      if (minMultiple %m == 0 && minMultiple %n == 0) {
        printf("%d and %d  the minMultiple is %d", m, n, minMultiple);
        break;
      }
      minMultiple++;
    }
    return 0;
}

执行结果

公式法

//通过最大公约数计算,公式计算:用两个数的积除去最大公约数得出它们的最小公倍数:m*n/max(gys)
void getGongbeishu1(int m, int n){
    int minMultiple;
    int gys = getGongyueshu2(m,n);
    minMultiple = m * n/gys;
    printf("%d and %d min minMultiple=%d\n", m, n, minMultiple);
}

求两数的最大公约数

分析:如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数。

比如:

12、16的公约数有1、2、4,其中最大的一个是4,则4是12与16的最大公约数。

12、18的公约数有1、2、3、6,其中最大的一个是6,则6是12与18的最大公约数。

void getGongyueshu(int m, int n){
    int gys;
    //暴力解决
    for(int i=1; i<= m && i<=n; i++) {
        if (m%i==0 && n%i==0) {
          //  printf("gys i=%d\n", i);
            gys = i;
        }
    }
     //printf("max gys=%d\n", gys);
    // getGongyueshu1(12,18);
    printf("%d, %d max gys=%d\n", m, n, getGongyueshu2(m,n));
}
//while
void getGongyueshu1(int m, int n){
   
    while (m != n)
    {
       if (m > n) {
        // m=12 - 6 = 6
        m-=n;
         printf("m - n\n");
       } else{
        // n = 18-12=6;
        n-=m;
        printf("n - m\n");
       }
    }
    printf("max gys=%d\n", m);
   
}
//使用递归
int getGongyueshu2(int m, int n){
   if(n != 0) {
     printf("%d yu %d yu=%d\n",m,n,  m%n);
    return getGongyueshu2(n, m%n);
   } else {
    return m;
   }
}

递归实现求最大公约数

int gcb(int a, int b) {
   if (b == 0) {
      return a;
   }
   return gcb(b, a%b); // 48 36  48%36 = 12  36%12 = 0 12 0
}
int main()
{
   int num1 =48, num2=36;
   int result =  gcb(num1, num2);
   printf("%d", result);
   return 0;
}

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值