大家好,这里是祁十一!今天为大家整理了一下GCD和LCM的内容。

目录

一、GCD(最大公约数)

1、定义

2、性质

3、代码实现

<1>Java自带函数

<2>辗转相除法

二、LCM(最小公倍数)

1、定义

2、性质

3、代码实现

<1>Java自带函数

<2>辗转相除法

三、真题再现

【等差数列】

【核桃的数量】

四、算法练习

【最大最小公倍数】

【最大体积】

【Hanksoon的趣味题】


一、GCD(最大公约数)

1、定义

整数a和b的最大公约数,能同时整除a和b的最大整数,记为gcd(a,b)

2、性质

(1)gcd(a,b) = gcd(a,a+b) = gcd(a,k*a+b)
(2)gcd(ka,kb) = k*gcd(a,b)
(3)多个整数的最大公约数:gcd(a,b,c) = gcd(gcd(a,b),c)
(4)若gcd(a,b) = d,则gcd(a/d,b/d) = 1,即a/d与b/d 互素
(5)gcd(a+cb,b) = gcd(a,b)

3、代码实现

<1>Java自带函数

import java.math.*;
import java.util.*;
public class Lanqiao{public static void main(String[] args) {Scanner sc = new Scanner(System.in);BigInteger x = sc.nextBigInteger();BigInteger y = sc.nextBigInteger();BigInteger gcd = x.gcd(y);   System.out.println(gcd);}
}

<2>辗转相除法

import java.util.*;
public class Lanqiao{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int x = sc.nextInt();int y = sc.nextInt();int z = gcd(x,y);System.out.println(z);}public static int gcd (int a,int b) {if(b==0)return a;elsereturn gcd(b,a%b);}
}

二、LCM(最小公倍数)

1、定义

整数a和b的最小公倍数,整除a和b有相同的倍数,该倍数(除0以外)为最小时,记为lcm(a,b)

2、性质

(1)a*b = lcm(a,b)* gcd(a,b)
(2)多个整数的最大公约数:gcd(a,b,c) = gcd(gcd(a,b),c)

3、代码实现

    注意再算的时候先除再乘,防止数据溢出

<1>Java自带函数

import java.math.*;
import java.util.*;
public class Lanqiao{public static void main(String[] args) {Scanner sc = new Scanner(System.in);BigInteger x = sc.nextBigInteger();BigInteger y = sc.nextBigInteger();BigInteger gcd = x.gcd(y);   System.out.println(gcd);System.out.println((x.multiply(y)).divide(gcd));}
}

<2>辗转相除法

import java.util.*;
public class Lanqiao{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int x = sc.nextInt();int y = sc.nextInt();int z1 = gcd(x,y);System.out.println(z1);int z2 = lcm(x,y);System.out.println(z2);}public static int gcd (int a,int b) {if(b==0)return a;elsereturn gcd(b,a%b);}public static int lcm(int a,int b) {int n=gcd(a,b);return a/n*b;}
}

三、真题再现

【等差数列】

问题描述

  数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。
  现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?

输入格式

  输入的第一行包含一个整数 N。
  第二行包含 N 个整数 A₁, A₂, · · · , AN。(注意 A₁ ∼ AN 并不一定是按等差数列中的顺序给出)

输出格式

  输出一个整数表示答案。

样例输入

5
2 6 4 10 20

样例输出

10

import java.util.*;
public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] A=new int[n];for(int i=0;i<n;i++) {A[i]=sc.nextInt();}Arrays.sort(A);int[] t=new int[n];for(int i=1;i<n;i++) {t[i]=A[i]-A[i-1];}Arrays.sort(t);int[] sm=new int[n];for(int i=1;i<t.length;i++) {sm[i]=gcd(t[i-1],t[i]);}Arrays.sort(sm);if(A[n-1]-A[0]==0) {System.out.println(n);}else {int sum=(int)(A[n-1]-A[0])/sm[1];System.out.println(sum+1);}}public static int gcd (int a,int b) {if(b==0)return a;elsereturn gcd(b,a%b);}
}

【核桃的数量】

问题描述

小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
  1. 各组的核桃数量必须相同
  2. 各组内必须能平分核桃(当然是不能打碎的)
  3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛)
程序输入:
  a b c
  a,b,c都是正整数,表示每个组正在加班的人数,用空格分开(a,b,c<30)
程序输出:
  一个正整数,表示每袋核桃的数量。
用户输入:
  2 4 5
程序输出:
  20

import java.util.*;
public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int a = sc.nextInt();int b = sc.nextInt();int c = sc.nextInt();System.out.println(lcm(lcm(a, b), c)); }public static int lcm(int a, int b) {return a * b / gcd(a, b);}public static int gcd (int a,int b) {if(b==0)return a;elsereturn gcd(b,a%b);}
}

四、算法练习

【最大最小公倍数】

之前在贪心写过,就先不在赘述辣。链接在这个!

【最大体积】

问题描述

  每个物品有一定的体积(废话),不同的物品组合,装入背包会占用一定的总体积。假如每个物品有无限件可用,那么有些体积是永远也装不出来的。为了尽量装满背包,附中的OIER想要研究一下物品不能装出的最大体积。题目保证有解,如果是有限解,保证不超过2,000,000,000
  如果是无限解,则输出0

输入格式

  第一行一个整数n(n<=10),表示物品的件数
  第2行到N+1行: 每件物品的体积(1<= <=500)

输出格式

  一个整数ans,表示不能用这些物品得到的最大体积。

样例输入

3
3
6
10

样例输出

17

import java.util.*;
public class Main{static int n;static int[] vol;public static void main(String[] args) {Scanner s=new Scanner(System.in);n=s.nextInt();int[] arr=new int[n+1];vol=new int[100001];for (int i=1;i<=n;i++){arr[i]=s.nextInt();if (arr[i]==1){//如果有一个数为1,则所有体积均可构成System.out.println(0);return;}}if (n==1||valueall(arr)!=1){System.out.println("0");return;}else {vol[0]=1;for (int i=1;i<=n;i++){for (int j=arr[i];j<=100000;j++){if (vol[j-arr[i]]==1){vol[j]=1;}}}for(int i=100000;i>=0;i--){if (vol[i]!=1){System.out.println(i);break;}}}}public static int valueone(int a,int b){//求最大公约数if (a%b==0){return b;}else {return valueone(b,a%b);}}private static int valueall(int[] arr) {//求所有数的公约数int temp=valueone(arr[1],arr[2]);for (int i=1;i<n;i++){temp=valueone(temp,arr[i+1]);}return temp;}
}

【Hanksoon的趣味题】

问题描述

  Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson。现 在,刚刚放学回家的Hankson 正在思考一个有趣的问题。 今天在课堂上,老师讲解了如何求两个正整数c1 和c2 的最大公约数和最小公倍数。现 在Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公 倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整 数x 满足: 1. x 和a0 的最大公约数是a1; 2. x 和b0 的最小公倍数是b1。 Hankson 的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的 x 并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x 的个数。请你帮 助他编程求解这个问题。

输入格式

  输入第一行为一个正整数n,表示有n 组输入数据。
  接下来的n 行每 行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入 数据保证a0 能被a1 整除,b1 能被b0 整除。

输出格式

  输出共n 行。每组输入数据的输出结果占一行,为一个整数。
  对于每组数据:若不存在这样的 x,请输出0; 若存在这样的 x,请输出满足条件的x 的个数;

样例输入

2
41 1 96 288
95 1 37 1776

样例输出

6
2

import java.util.*;
public class Main{public static void main(String[] args) {Scanner sc=new Scanner(System.in);int t=sc.nextInt();while(t>0){long a0=sc.nextLong();long a1=sc.nextLong();long b0=sc.nextLong();long b1=sc.nextLong();long x=0; int ans=0;for(int i=1;i<1000;i++){if(gcd(i,a0)==a1){x=i;break;}}for(long j=x;j<=b1;j+=x){if(lcm(j,b0)==b1)ans++;}System.out.println(ans);}}public static int lcm(long j, long b0) {return (int) (j * b0 / gcd(j, b0));}public static int gcd (long j,long a0) {if(a0==0)return (int) j;elsereturn gcd(a0,j%a0);}
}

【备战蓝桥】JavaB组算法小讲解——GCD和LCM相关推荐

  1. 【备战蓝桥杯】 算法·每日一题(详解+多解)-- day11

    [备战蓝桥杯] 算法·每日一题(详解+多解)-- day11 ✨博主介绍 前言 Dijkstra 算法 流程 网络延迟时间 解题思路 Bellman-Ford 算法 流程 K 站内最便宜的航班 解题思 ...

  2. 蓝桥javab组数字三角形--dfs的思路

    数字三角形 基本思想 dfs模板 蓝桥javab组数字三角形 思路 代码 基本思想 第一次学习dfs的同学也许像我一样,刚开始学习的时候,感觉在写dfs不知道要干些什么. 首先我们要知道dfs和bfs ...

  3. 备战蓝桥杯-枚举、排序、模拟专项练习详解(含有多道蓝桥杯原题)

    枚举.模拟与排序 蓝桥杯所有专项练习 蓝桥杯原题: 连号区间数 小明这些天一直在思考这样一个奇怪而有趣的问题: 在 1∼N1∼N 的某个排列中有多少个连号区间呢? 这里所说的连号区间的定义是: 如果区 ...

  4. java dfs算法蓝桥杯题_【蓝桥杯省赛JavaB组真题详解】四平方和(2016)_疼疼蛇的博客-CSDN博客...

    原文作者:疼疼蛇 原文标题:[蓝桥杯省赛JavaB组真题详解]四平方和(2016) 发布时间:2021-02-26 15:00:01 题目描述 四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数 ...

  5. 2020第十一届蓝桥杯7月份省赛真题(JavaB组题解)

    2020第十一届蓝桥杯7月份省赛真题(JavaB组题解) 试题 A: 解密 试题 B: 纪念日 试题 C: 合并检测 试题 D: 分配口罩 试题 E: 斐波那契数列最大公约数 试题 F: 分类计数 试 ...

  6. 2018年第九届蓝桥杯 JavaB组省赛 刷题思路及答案

    前言 本人是二本院校大二的计算机系学生,已经报名了下一届的蓝桥杯省赛,整个寒假学习了很多算法知识,我是看<算法很美>这个课程学习算法的,一套学习下来确实受益匪浅,视频在b站上面都有. 此前 ...

  7. 第十四届蓝桥杯大赛软件赛省赛JavaB组解析

    目录 说在前面 试题 A: 阶乘求和 代码: 题目分析: 试题 B: 幸运数字 代码: 题目分析: 试题 D: 矩形总面积 代码: 题目分析: 试题 G: 买二赠一 代码: 题目分析: 试题 H: 合 ...

  8. 2020第十一届蓝桥杯10月份省赛真题(JavaB组题解)

    2020第十一届蓝桥杯10月份省赛真题(JavaB组题解) 试题 A:门牌制作 试题 B:寻找 2020 试题 C:蛇形填数 试题 D: 七段码 试题 E:排序 试题 F: 成绩分析 试题 G: 单词 ...

  9. 2018第九届蓝桥杯JavaB组省赛真题及详解

    2018第九届蓝桥杯JavaB组省赛真题及详解 第一题:第几天 第二题:方格计数 第三题:复数幂 第四题:测试次数 第五题:快速排序 第六题:递增三元组 第七题:螺旋折线 第八题:日志统计 第九题:全 ...

最新文章

  1. 学习《Linux设备模型浅析之设备篇》笔记(三)
  2. SAP WMSD集成之Copy WM Quantity – Not Copy WM qty as delivery qty into delivery But PGI
  3. Design Pattern - Facade(C#)
  4. Pandas的学习(5.pandas中处理丢失数据和空值数据以及填充空值数据)
  5. Android adb logcat使用技巧
  6. 论文浅尝 - ICML2020 | 拆解元学习:理解 Few-Shots 任务中的特征表示
  7. html音频控件隐藏,html5 – Html 5音频标签自定义控件?
  8. html出现403错误信息,网站(HTTP)出现403错误集锦,请对号入座;
  9. 如何用命令获知当前是一年中的第多少周和今天是周几
  10. python库--pandas--Series
  11. RocketMQ助力编程猫构建稳定的业务系统 | 凌云时刻
  12. 切换IE浏览器的版本
  13. 求助:hmailserver+roundcube启用密码插件后,用户无法修改密码问题
  14. 如何改变Python画笔颜色
  15. 关于生产环境跨域问题
  16. html笔记(完整版)
  17. 《BIGEMAP地图软件》荣登2017、2018年度论坛《最受欢迎谷歌地图软件》
  18. 机器学习从零到一的基础知识总集篇
  19. 公司如何选择适合的管理软件?
  20. wscript是何物

热门文章

  1. Matlab转Python问题之二维数组单索引寻值
  2. python 爬取 mm131 图片
  3. python 基础代谢率计算_BMR计算(Python),的
  4. 供应链管理问题会否导致小米在印度市场受挫?
  5. 用于ECharts的全国省市区县乡镇街道级的行政区划边界数据(GeoJSON格式)
  6. 【华人学者风采】陈卫 亚洲微软研究院
  7. PHP 3DES加密
  8. 如何备份管家婆软件数据?3种方法详解
  9. 微信小程序监听实时地理位置变化事件接口申请
  10. 字符指针指向字符串理解