求最大公约数和最小共倍数的方法(除穷举)

求最小共倍数:

最小共倍数=两数的成绩÷最大公约数。

求最大公约数:

  1. 辗转相除法
  2. 相减法

辗转相处:

有两整数a和b:

① a%b得余数c

② 若c=0,则b即为两数的最大公约数

③ 若c≠0,则a=b,b=c,再回去执行①

例如求27和15的最大公约数过程为:

27÷15 余1215÷12余312÷3余0因此,3即为最大公约数

#include<bits/stdc++.h>
using namespace std;
int main(){//  辗转相除法求最大公约数 
    int a,b,c;
    scanf("%d%d",&a,&b);
    int m=a,n=b;
    while(c!=0){// 余数不为0,继续相除,直到余数为0 
        c=a%b;
        a=b;
        b=c;
    }
    printf("The largest common divisor:%d\n",a);//注意这里不是b,因为跳出循环时b已经是c了
    printf("The least common multiple:%d",m*n/a);
    return 0;
}

相减法:

有两整数a和b:

① 若a>b,则a=a-b

② 若a<b,则b=b-a

③ 若a=b,则a(或b)即为两数的最大公约数

④ 若a≠b,则再回去执行①

例如求27和15的最大公约数过程为:

27-15=12( 15>12 ) 15-12=3( 12>3 )

12-3=9( 9>3 ) 9-3=6( 6>3 )

6-3=3( 3==3 )

因此,3即为最大公约数

#include<bits/stdc++.h>
using namespace std;
int a,b;
int main(){
    scanf("%d%d",&a,&b);
    int m=a,n=b;
    while(a!=b){
        if(a>b)a=a-b;
        if(a<b)b=b-a;
    }
    printf("The largest common divisor:%d\n",a);
    printf("The least common multiple:%d",m*n/a);
    return 0;
}

洛谷小题:

#include<bits/stdc++.h>
using namespace std;
int x,y;
int ans;
int gcd(int a,int b){//求最大公约数
    //if(a<b)swap(a,b);
    if(a%b==0)return b;
    if(a==b)return b;
    return gcd(b,a%b);
}

int lcm(int a,int b){//求最小共倍数
    return a*b/gcd(a,b);
}

int main(){
    scanf("%d%d",&x,&y);
    for(int i=x;i<=y;i++){
        int j=x*y/i;
        if(gcd(i,j)==x&&lcm(i,j)==y){
            ans++;
        }
    }
    printf("%d",ans);
    return 0;
}

 

原文链接: https://www.cnblogs.com/LightyaChoo/p/13226840.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    求最大公约数和最小共倍数的方法(除穷举)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/361460

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午1:50
下一篇 2023年3月2日 下午1:50

相关推荐