首页 > 其他分享 >最大公约数最小公倍数的探索(三种方法)

最大公约数最小公倍数的探索(三种方法)

时间:2022-10-30 16:55:20浏览次数:71  
标签:98 公倍数 int 最大公约数 63 三种 余数

本题要求两个给定正整数的最大公约数和最小公倍数。

第一遍自己做时,根据原理暴力求解

 

 

 

 结果可想而知超时了

 

看完翁恺老师的视频,学会第二种方法———辗转相除法

辗转相除法是求最大公约数的一种方法。它的具体做法是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。这个和更相减损术有着异曲同工之处。

 

#include<stdio.h>
int gcd(int a, int b) {
 int t;
 while(b!=0) {
  t=a%b;
  a=b;
  b=t;
 }
 return a;
}
int main() {
 int a,b;
 scanf("%d%d",&a,&b);
 printf("gcd=%d\n",gcd(a,b));
 return 0;
}

 

最后在找网上其他资料时,发现一种和辗转相除法类似的方法————

更相减损术

这里举个例子

用更相减损术求98与63的最大公约数。(一奇一偶)
由于63不是偶数,把98和63以大数减小数,并辗转相减:
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
当差和被减数相等时候,运算结束
所以,98和63的最大公约数等于7。

并且求最大公倍数只需将两数相乘再除最后的数

#include<stdio.h>
#include<math.h>
int main()
{
    int x,y,n;
    scanf("%d %d",&x,&y);
    n=x*y;
    while(x!=y){
        if(x>y){
            x=x-y;}
        else{y=y-x;}
    };
    printf("%d %d",x,n/x);
    return 0;
}

 

 

总结:三种方法都正确,第一种是按定义来,查找速度比较慢;第二和第三种都需要一定的数学层面上的理解;学好数学打代码运行才不会超时呀!

 

标签:98,公倍数,int,最大公约数,63,三种,余数
From: https://www.cnblogs.com/asl654-/p/16841629.html

相关文章