最大公约数 和最小公倍数。(max Common Divisor min common multiple)

假设有两个数a,b,所谓的公约数就是能把a,b整除的最大整数。

明白了要求我们就来解决问题,一拿到问题我们都应该都能想到一个方法,就是使用穷举法,从2开始一个个找,到一个两个都能除的就记录起来,一直找到小于min(a,b)结束,
记录到的值就是他们的最大公约数代码由下:
public static int getMaxDivide_ab(int a, int b) {
int value = 1;
int max;
int min;
if (a == b) {
return a;
}
if (a > b) {
max = a;
min = b;
} else {
max = b;
min = a;
}
for (int i = min; i >=2; i--) {
if (0 == max % i && 0 == min % i) {
value = i;
break;
}
}
return value;

}

第二种方法是使用欧几里德算法,这个已经有2000+年的历史了,这个比起上一个来的要高效,假设我们的最大公约数表示为f(a,b),并且有a>=b>0,
欧几里德就给了我们一个很好的定理,f(a,b)=f(b,a%b),有了这个等式我们就很容易得出这个算法的递归式,现在我们来看下这个等式是怎么来的
设有 r=a/b ,q=a%b  
所以就有 a=a/b*b+q  ----(这里的a/b*b!=a   ,原因就是我们用的是整数来计算的)
也就是a=r*b+q     变换一下有:q=a-r*b      设d=f(a,b),a/d=m,b/d=n;则  有q=dm-r*dn=d(m-rn)
所以q/d也为0;设d|q表示d是q的约数;以下相同;
又有d|b;所以有d|(b,q),设D是(b,q)的最大公约数,则会有d<=D=f(b,q);

再回到前面r=a/b,q=a%b这两个条件有
a=r*b+q,由于D|(b,q),所以D|a,所以有D|(a,b)
所以有D<=d=f(a,b),结合上部分就有d<=D <+d,及D=d;
所以得证;
public static int oujilide(int a,int b){
        if(a<b){
                int temp;
                temp=a;
                a=b;
                b=temp;
        }
        if(0==b){
                return a;
        }
        return oujilide(b,a%b);

最小公倍数 既: 两个数的成绩除以两数的最大公约数。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,求最大公约数最小公倍数有几种常用的方法。 方法一:辗转相除法。该方法的具体步骤是,用较小数除较大数,再用出现的余数去除除数,反复进行,直到余数为0。最后的除数即为最大公约数最小公倍数可以通过两个数的乘积除以最大公约数得到。 方法二:更相减损法。该方法的步骤是,任意给定两个正整数,判断它们是否都是偶数,若是,则用2约简;若不是,则执行下一步。以较大的数减去较小的数,然后用所得的差与较小的数比较,继续执行这个操作,直到所得的减数和差相等。第一步中约掉的若干个2与第二步中等数的乘积就是最大公约数最小公倍数可以通过两个数的乘积除以最大公约数得到。 方法三:穷举法。该方法的步骤是,从1到较小的数逐个去除,找到两个数都能整除的最大的数,即为最大公约数最小公倍数可以通过两个数的乘积除以最大公约数得到。 下面是几种方法的Python代码示例: ```python # 辗转相除法 a = int(input("请输入第一个数字:")) b = int(input("请输入第二个数字:")) m = a n = b while b != 0: temp = a % b a = b b = temp max_common_divisor = a min_common_multiple = m * n // a print("最大公约数是:%d,最小公倍数是:%d" % (max_common_divisor, min_common_multiple)) # 更相减损法 a = int(input("请输入第一个数字:")) b = int(input("请输入第二个数字:")) m = a n = b if a < b: a, b = b, a divisors = [] num = 1 if a % 2 == 0 and b % 2 == 0: a, b = a // 2, b // 2 num *= 2 r = a - b while r not in divisors: divisors.append(r) a = max(b, r) b = min(b, r) r = a - b max_common_divisor = num * r min_common_multiple = (m * n) // (num * r) print("最大公约数是:%d,最小公倍数是:%d" % (max_common_divisor, min_common_multiple)) # 穷举法 a = int(input("请输入第一个数字:")) b = int(input("请输入第二个数字:")) m = a n = b while a != b: if a > b: a = a - b else: b = b - a max_common_divisor = a min_common_multiple = (m * n) // a print("最大公约数是:%d,最小公倍数是:%d" % (max_common_divisor, min_common_multiple)) ``` 以上是三种常用的方法,你可以根据需要选择其中一种方法来求解最大公约数最小公倍数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python求最大公约数最小公倍数](https://blog.csdn.net/qq_46857088/article/details/124002509)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [python求最大公约数最小公倍数的方法](https://blog.csdn.net/qq_40161609/article/details/82469855)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值