1. 最大公约数(Greatest Common Divisor(GCD))

1.1 基本概念

最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。

1.2 算法

辗转相除法

辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。

例如,求(319,377):

∵ 319÷377=0(余319)

∴(319,377)=(377,319);

∵ 377÷319=1(余58)

∴(377,319)=(319,58);

∵ 319÷58=5(余29)

∴ (319,58)=(58,29);

∵ 58÷29=2(余0)

∴ (58,29)= 29;

∴ (319,377)=29。

可以写成右边的格式。

用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。

2. 最小公倍数(Least Common Multiple(LCM))

2.1 基本概念

两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号。

与最小公倍数相对应的概念是最大公约数,a,b的最大公约数记为(a,b)。关于最小公倍数与最大公约数,我们有这样的定理:(a,b)[a,b]=ab(a,b均为整数)

2.2 算法

公式法

由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即(a,b)×[a,b]=a×b。所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。

Java语言实现求最大公约数(GCD)和最小公倍数(LCM)

  • 程序一
  1. package com.echo;
  2. import java.util.Scanner;
  3. public class GCDLCM {
  4. // 最大公约数
  5. public static int get_gcd(int n1, int n2) {
  6. int gcd = 0;
  7. if (n1 < n2) {// 交换n1、n2的值
  8. n1 = n1 + n2;
  9. n2 = n1 - n2;
  10. n1 = n1 - n2;
  11. }
  12. if (n1 % n2 == 0) {
  13. gcd = n2;
  14. }
  15. while (n1 % n2 > 0) {
  16. n1 = n1 % n2;
  17. if (n1 < n2) {
  18. n1 = n1 + n2;
  19. n2 = n1 - n2;
  20. n1 = n1 - n2;
  21. }
  22. if (n1 % n2 == 0) {
  23. gcd = n2;
  24. }
  25. }
  26. return gcd;
  27. }
  28. // 最小公倍数
  29. public static int get_lcm(int n1, int n2) {
  30. return n1 * n2 / get_gcd(n1, n2);
  31. }
  32. public static void main(String[] args) {
  33. Scanner input = new Scanner(System.in);
  34. System.out.print("请输入第一个整数:");
  35. int n1 = input.nextInt();
  36. System.out.print("请输入第二个整数:");
  37. int n2 = input.nextInt();
  38. System.out.println("(" + n1 + "," + n2 + ")" + "=" + get_gcd(n1, n2));
  39. System.out.println("[" + n1 + "," + n2 + "]" + "=" + get_lcm(n1, n2));
  40. }
  41. }
  • 程序二
  1. package com.echo;
  2. import java.util.Scanner;
  3. public class GCDLCM {
  4. // 最大公约数
  5. public static int get_gcd(int a, int b) {
  6. int max, min;
  7. max = (a > b) ? a : b;
  8. min = (a < b) ? a : b;
  9. if (max % min != 0) {
  10. return get_gcd(min, max % min);
  11. } else
  12. return min;
  13. }
  14. // 最小公倍数
  15. public static int get_lcm(int a, int b) {
  16. return a * b / get_gcd(a, b);
  17. }
  18. public static void main(String[] args) {
  19. Scanner input = new Scanner(System.in);
  20. int n1 = input.nextInt();
  21. int n2 = input.nextInt();
  22. System.out.println("(" + n1 + "," + n2 + ")" + "=" + get_gcd(n1, n2));
  23. System.out.println("[" + n1 + "," + n2 + "]" + "=" + get_lcm(n1, n2));
  24. }
  25. }

Java求最大公约数和最小公倍数的更多相关文章

  1. JAVA 基础编程练习题6 【程序 6 求最大公约数及最小公倍数】

    6 [程序 6 求最大公约数及最小公倍数] 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数. 程序分析:利用辗除法. package cskaoyan; public class csk ...

  2. c语言求最大公约数和最小公倍数

    求最大公约数和最小公倍数 假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因 ...

  3. java求最大公约数,和最小公倍数

    import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = ...

  4. Java50道经典习题-程序6 求最大公约数及最小公倍数

    题目:输入两个正整数m和n,求其最大公约数和最小公倍数.分析:用辗转相除法求最大公约数    两个数的最大公约数:设两个数分别为n和m,(n>=m);用定义一个变量i,使用for循环,将i的取值 ...

  5. Problem06 求最大公约数及最小公倍数

    题目:输入两个正整数m和n,求其最大公约数(m,n)和最小公倍数[m,n]. 程序分析:利用辗转相除法. 利用辗除法:用较大数除以较小数,再用出现的余数(第一余数)去除除数, 再用出现的余数(第二余数 ...

  6. 辗转相除法求最大公约数和最小公倍数【gcd】

    要求最小公倍数可先求出最大公约数 设要求两个数a,b的最大公约数 伪代码: int yushu,a,b: while(b不等于0) { yushu=a对b求余 b的值赋给a yushu的值赋给b } ...

  7. java求最大公约数(分解质因数)

    下面是四种用java语言编程实现的求最大公约数的方法: package gcd; import java.util.ArrayList; import java.util.List; public c ...

  8. c语言求最大公约数和最小公倍数(转)

    最大公约数与最小公倍数的求解是很多初学C的人所面临的一道问题.当然这道问题并不难解答,也有很多人已经写过相关的博客,我在此书写此篇博客,一是为了让自己能够夯实基础,另外就是希望能够帮到和我一样的初学者 ...

  9. 求最大公约数和最小公倍数_python

    """写两个函数,分别求两个整数的最大公约数和最小公倍数,调用这两个函数,并输出结果.两个整数由键盘输入.""" ''' 设两个整数u和v, ...

随机推荐

  1. 一步一步从原理跟我学邮件收取及发送 13.mime格式与常见字符编码

    在前面的本系列文章中我们已经学会了邮件的发送和收取.但在收取中我们看到的是一串串的乱码,回忆前面的发送过程,我们会奇怪:我们前面的邮件是明文啊.为什么明文的邮件明明也可以正常工作,还要弄乱码似的字符串 ...

  2. 《InsideUE4》UObject(六)类型系统代码生成重构-UE4CodeGen_Private

    读的不如写的快 引言 在之前的<InsideUE4>UObject(四)类型系统代码生成和<InsideUE4>UObject(五)类型系统收集章节里,我们介绍了UE4是如何根 ...

  3. JavaScript数据迭代方法差别

    js有很多总接待方法,ES6之后又新增了几个: 这里主要讨论数组迭代遍历的方法所以不会细讲for...in... ES5.ES6数组迭代方法有: forEach map filter some eve ...

  4. wpf 如何让控件左右移动

    通过DoubleAnimation可以让控件进行左右移动. <Canvas x:Name="canvas_Shape" HorizontalAlignment="S ...

  5. HDU - 1584 IDA*

    思路:裸的IDA*,估计当前状态至少需要多少距离才能达到目标状态,剪枝即可.每一墩牌只需记录其最上面和最下面的牌型即可完成移动. AC代码 #include <cstdio> #inclu ...

  6. APP性能测试(启动时间)

    #encoding:utf-8 import csv import os import time class App(object): def __init__(self): self.content ...

  7. php-fpm问题

    这个问题怎么说呢?之前遇到这个问题内心是奔溃的.因为我压根不知道是哪里出问题啦.不过,在我努力探索下,最终还是解决了问题. so请记住,坚持不一定成功,但放弃一定失败. 简单描述一下问题: 1.本地的 ...

  8. redis分布式锁的几种实现方式,以及Redisson的配置和使用

    最近在开发中涉及到了多个客户端的对redis的某个key同时进行增删的问题.这里就会涉及一个问题:锁 先举例在分布式系统中不加锁会出现问题: redis中存放了某个用户的账户余额 ,例如100 (用户 ...

  9. RISC_CPU

    采用Top-Down设计方法,深入理解CPU的运作原理,本文参照夏宇闻老师的<Verilog 数字系统设计教程>,并做了相应的修改.仿真工具采用Mentor公司的ModelSim. 1.C ...

  10. 一句Python,一句R︱numpy、array——高级matrix

    先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句python,对应写一句R. python中的numpy模块相当于R中的matirx矩 ...