【创作赢红包】求最大公因数与最小公倍数

news/2024/7/24 12:39:11 标签: java, 算法, 开发语言

什么是最小公因数

最大公约数(Greatest Common Divisor)指两个或多个整数共有约数中最大的一个。也称最大公因数、最大公因子,a, b的最大公约数记为(a,b),同样的,a,b,c的最大 公约数记为(a,b,c),多个 整数的最大公约数也有同样的记号。求最大公约数有多种 方法,常见的有 质因数分解法、 短除法、 辗转相除法、 更相减损法。

辗转相除法求最小公因数

用(a,b)表示a和b的最大公因数:有结论(a,b)=(a,ka+b),其中a、b、k都为自然数。

也就是说,两个数的最大公约数,将其中一个数加到另一个数上,得到的新数,其公约数不变,比如(4,6)=(4+6,6)=(4,6+2×4)=2.

要证明这个原理很容易:如果p是a和ka+b的公约数,p整除a,也能整除ka+b.那么就必定要整除b,所以p又是a和b的公约数,从而证明他们的最大公约数也是相等的.

基于上面的原理,就能实现我们的迭代相减法:(78,14)=(64,14)=(50,14)=(36,14)=(22,14)=(8,14)=(8,6)=(2,6)=(2,4)=(2,2)=(0,2)=2

基本上思路就是大数减去小数,一直减到能算出来为止,在作为练习的时候,往往进行到某一步就已经可以看出得值.

迭代相减法简单,不过步数比较多,实际上我们可以看到,在上面的过程中,由(78,14)到(8,14)完全可以一步到位,因为(78,14)=(14×5+8,14)=(8,14),由此就诞生出我们的辗转相除法.

即:(a, b) = (a % b, b) = (b, a %b)

相当于每一步都把数字进行缩小,等式右边就是每一步对应的缩小结果。

对(a, b)连续使用辗转相除,直到小括号内右边数字为0,小括号内左边的数就是两数最大公约数。

代码实现

java">import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int T = scan.nextInt();
        while(T --> 0){
            int a = scan.nextInt();
            int b = scan.nextInt();
            System.out.println(gcd(a,b));
        }
    }
    public static int gcd(int a,int b){
        return b!=0 ? gcd(b,a%b):a;
    }
}

最小公倍数

与最大公因数类似,只是把约数换成了倍数

求最小公倍数

十分简单,我们只需知道简单的一个定理,两个数的最小公倍数就等于两个数的乘积/他们的最大公因数

a * b / gcd(a,b)

例题

小张是软件项目经理,他带领 33 个开发组。

工期紧,今天都在加班呢。

为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。

他的要求是:

  1. 各组的核桃数量必须相同
  2. 各组内必须能平分核桃(当然是不能打碎的)
  3. 尽量提供满足 1,21,2 条件的最小数量(节约闹革命嘛)

输入格式

包含 a,b,c 三个正整数,表示每个组正在加班的人数。

输出格式

一个正整数,表示每袋核桃的数量。

数据范围

0<a,b,c<30

输入样例1:

2 4 5

输出样例1:

20

输入样例2:

3 1 1

输出样例2:

3

代码实现

java">import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt();
        int b = scan.nextInt();
        int c = scan.nextInt();
        int a_b = a * b / gcd(a,b);
        int a_b_c =a_b * c / gcd(a_b,c);
        System.out.println(a_b_c);
    }
    public static int gcd(int a,int b){
        return b != 0 ? gcd(b , a % b) : a;
    }
}

http://www.niftyadmin.cn/n/182303.html

相关文章

服务器版RstudioServer安装与配置详细教程

Docker部署Rstudio server 背景&#xff1a;如果您想在服务器上运行RstudioServer&#xff0c;可以按照如下方法进行操作&#xff0c;笔者测试时使用腾讯云服务器&#xff08;系统centos7&#xff09;&#xff0c;需要在管理员权限下运行 Rstudio 官方提供了使用不同 R 版本的 …

Mybatis-Plus进阶使用

一、逻辑删除 曾经我们写的删除代码都是物理删除。 逻辑删除&#xff1a;删除转变为更新 update user set deleted1 where id 1 and deleted0 查找: 追加 where 条件过滤掉已删除数据,如果使用 wrapper.entity 生成的 where 条件也会自动追加该字段 查找: select id,name,dele…

反光板导航SLAM(四)如何通过两个反光柱估计位姿

通常而言确定空间中的一个点的坐标需要三个点&#xff0c;也就是俗称的三点定位。但是在某些时候&#xff0c;场景内可能不一定能够采样到足够多的反光柱&#xff0c;比如只有两个。这个时候看起来似乎参数是不足的&#xff0c;毕竟机器人的参数有三个&#xff0c;两个方程是不…

个人练习-Leetcode-89. Gray Code

题目链接&#xff1a;https://leetcode.cn/problems/gray-code/submissions/ 题目大意&#xff1a;给出位数n&#xff0c;求一个合法的n位格雷码排列。 思路&#xff1a;低位数的格雷码是容易得出的&#xff0c;考虑从n-1位的格雷码得到n位格雷码。设现有Gn−1G_{n-1}Gn−1​…

关于前端工具layui的一些使用总结

说明&#xff1a; 最近小组在做一个自研的字节码增强工具。因为是预研性质&#xff0c;所以前端的操作界面就自己上手写了。使用了比较亲和后端开发的layui框架。后端采用springbootthymeleaf 后端配置静态资源和thymeleaf&#xff1a; application.yml&#xff1a; 静态资源…

并发编程(九)-ScheduledExecutorService源码分析

一、ScheduledExceutorService简介 ScheduledExecutorService 是 Java 并发包中提供的一个接口&#xff0c;继承ExecutorService接口&#xff0c;是Executor框架的一个扩展。它可以用于调度任务在指定的时间或周期性地执行。相比于 Timer 和 TimerTask&#xff0c;ScheduledExe…

【LeetCode刷题-Python】有序数组的平方

977.有序数组的平方 977.有序数组的平方 题目 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平…

TryHackMe-Madeye‘s Castle(boot2root)

Madeye’s Castle 一个boot2root盒子&#xff0c;由Runcode.ninja团队在CuCTF中使用的盒子修改而来 祝你冲进麦德耶的城堡玩得开心&#xff01;在这个房间里&#xff0c;你需要完全枚举系统&#xff0c;站稳脚跟&#xff0c;然后转向几个不同的用户。 端口扫描 循例nmap SMB…