最大公约数和最小公倍数

1. 最大公约数*

描述
如果有一个自然数 a 能被自然数 b 整除,则称 a 为 b 的倍数, b 为 a 的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
输入 a 和 b , 请返回 a 和 b 的最大公约数。
数据范围: 1 ≤ a , b ≤ 1 0 9 1 \leq a,b \leq 10^{9} 1a,b109
进阶:空间复杂度 O ( 1 ) O(1) O(1),时间复杂度 O ( l o g n ) O(logn) O(logn)

知识点:基础数学

示例1

输入:3, 6
返回值:3

示例2

输入:8, 12
返回值:4
public int gcd (int a, int b) {
	return b == 0 ? a : gcd(b, a % b);
}

2. 最大的最小公倍数与最大公约数的差*

描述
找出两个数a、b( 1 ≤ a , b ≤ n 1 \leq a,b \leq n 1a,bn),且 l c m ( a , b ) − g c d ( a , b ) lcm(a,b)-gcd(a,b) lcm(a,b)gcd(a,b)尽量大。输出最大的 l c m ( a , b ) − g c d ( a , b ) lcm(a,b)-gcd(a,b) lcm(a,b)gcd(a,b)
其中 l c m ( a , b ) lcm(a,b) lcm(a,b)表示a和b的最小公倍数, g c d ( a , b ) gcd(a,b) gcd(a,b)表示a和b的最大公约数。
输入描述: 一行一个数字。
输出描述:一行一个数字表示最大的。

知识点:数学基础

示例1

输入:5
返回值:19

示例2

输入:3
返回值:5

思路:若要返回最大的差值,选取极端的情况:相邻的两个数的 l c m ( a , b ) − g c d ( a , b ) lcm(a,b)-gcd(a,b) lcm(a,b)gcd(a,b)最大。根据示例,选取a和a-1这两个数,来求取最大差值。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        long a = in.nextLong();
        long b = a - 1;
        // 取一个极端的情况(因为差要尽量大,所以取相邻两个数的最小公倍数与最大公约数的差)
        System.out.println(a * b - 1);
    }
}

3.最小公倍数**

描述
正整数A和正整数B 的最小公倍数是指能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。
数据范围:1≤a,b≤100000
输入描述:输入两个正整数A和B。
输出描述:输出A和B的最小公倍数。
知识点:递归,基础数学

示例1

输入:5 7
返回值:35

示例2

输入:2 4
返回值:4

思路:定义a,b的最大公约数为 g c d ( a , b ) gcd(a,b) gcd(a,b),最小公倍数为 l c m ( a , b ) lcm(a,b) lcm(a,b),即有 g c d ( a , b ) ∗ l c m ( a , b ) = a ∗ b gcd(a,b)*lcm(a,b)=a*b gcd(a,b)lcm(a,b)=ab
最大公约数 g c d ( a , b ) gcd(a,b) gcd(a,b)的计算是根据Euclidean algorithm来的,以求取a=1071和b=462的最大公约数为例,具体过程步骤如下:
step1:1071/462 = 2 余147
step2:462/147 = 3 余 21
step3:147/21 = 7 余0
此时,余数为0,所以1071和462的最大公约数为 21。
递归公式 g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b),边界条件 i f ( b = = 0 ) , g c d ( a , b ) = a if(b==0) ,gcd(a,b)= a if(b==0),gcd(a,b)=a

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = br.readLine()) != null) {
            String[] array = line.split(" ");
            int a = Integer.parseInt(array[0]);
            int b = Integer.parseInt(array[1]);
            int lcm = a * b / gcd(a, b);
            System.out.println(lcm);
        }
    }

    public static int gcd(int a, int b) {
        if (b == 0) {
            return a;
        }
        return gcd(b, a % b);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值