辗转相除法_欧几里得算法_java的实现(求最大公约数)

辗转相除法,又被称为欧几里德(Euclidean)算法, 是求最大公约数的算法。
当然也可以求最小公倍数。

算法描述

  两个数a,b的最大公约数记为GCD(a,b)。a,b的最大公约数是两个数的公共素因子的乘积。如462可以分解成2 × 3 × 7 × 11;1071可以分解成3 × 3 × 7 × 17。462和1071的最大公约数等于它们共有的素因数的乘积3 × 7 = 21。如果两数没有公共的素因数,那么它们的最大公约数是1,也即这两个数互素,即GCD(a,b)=1。另g=GCD(a,b),则a=mg, b=ng,其中m,n均为正整数。由上述分析可知,m,n互素。因为m,n没有公共素因子,GCD(m,n)=1。
  辗转相除法是一种递归算法。

算法实现:
递归版本:

    private static int gac(int a, int b) {
        if(a<b){
            swap(a,b);
        }
        if(b==0)
            return a;
        else
            return gcd(b,a%b);

    }

    private static void swap(int a, int b) {
        a=a^b;
        b=a^b;
        a=a^b;
    }

循环版本:

private static int gac(int a, int b) {
        if(a<b){
            swap(a,b);
        }
        while(b!=0){
            int c = a%b;
            a=b;
            b=c;
        }
        return a;
    }

    private static void swap(int a, int b) {
        a=a^b;
        b=a^b;
        a=a^b;
    }

2个数a,b;已知最大公约数为n;
最小公倍数=a*(b/n);

时间: 2024-11-01 05:28:42

辗转相除法_欧几里得算法_java的实现(求最大公约数)的相关文章

C语言 扩展欧几里得算法代码_C 语言

给定两个正整数m和n,我们计算它们的最大公因子d和两个整数a和b,使得a*m+b*n=d 算法流程 E1.置a'=b=1;a=b'=0;c=m,d=n; E2.计算d和r,使得c=q*d+r; E3.若r==0;则退出,当前已有a*m+b*n=d; E4;c=d;d=r;t=a';a'=a;a=t-q*a;t=b';b'=b;b=t-q*b;返回E2. 证明 对于已有的m和n,假设m>n;如果刨除变量a,b,a',b';算法与欧几里得算法完全一样,为计算最大公约数的算法. 最终要求的为a*m+b

算法 数据结构-求两个数最大公约数,欧几里得算法

问题描述 求两个数最大公约数,欧几里得算法 求两个数最大公约数,欧几里得算法,这两种方法除第一种可以避免除数为零的情况,两者有什么区别?谢谢 public static int gcd(int p, int q) { if (q == 0) return p; int r = p % q; return gcd(q, r) ; } public static int gcd(int p, int q) { int r = p % q; if (r == 0) return q; return g

更相损减法和辗转相除法 求最大公约数和最小公倍数(C语言)

假设有两个数a和b,求a,b的最大公约数和最小公倍数实际上是一个问题,得出这两个数的最大公约数就可以算出它们的最小公倍数. 最小公倍数的公式是 a*b/m m为最大公约数 因为 a=m*i; b=m*j; 最小公倍数为 m*i*j 那么,下面就开始计算a和b的最大公约数. 更相损减法: <九章算術·方田>作分數約簡時,提到求最大公因數方法:反覆把兩數的較大者減去較小者,直至兩數相等,這數就是最大公因數.這方法除了把除法換作減法外,與輾轉相除法完全相同.例如書中求91和49的最大公因數: 91

【算法数据结构Java实现】欧几里得算法

1.背景            欧几里得算法是一个求最大因子的快速算法.如果m,n存在最大因子k,假设m=x*n+r,那么m和n可以整出k的话,r也肯定可以整除k            因为定理:如果M>N,则M mod N<M/2 ,说明时间复杂度是O(log(n)) 2.代码            package Algorithm_analysis; public class Euclid { public static void main(String[] args){ int m=6

菜鸟学算法----改进后的欧几里得算法

对于正整数 a和b  利用欧几里得算法可以得出 一个最大公因数 ,  改进后的算法满足  最大公因数 q=xa+yb   ; 那么我们如何求出 a和b呢 . 书上是这么写的 那么我们用代码把他实现出来, 向大家推荐一本书<The Art Of Computer.Programmer>   第一篇的数学部分   真心的枯燥 我选择的方式 是 适当的囫囵吞枣 对于这一样 ,但是对于其中讲述的算法 还是要仔细的去看滴 .   对于算法的分析  我直接上原书图 #include "stdaf

数论之 素因子分解,素数筛选法,欧拉函数和扩展欧几里得算法 (整理)

今天突然想复习一下数论,也就顺便整理了一下关于数论的基础知识, 以后用的时候直接用就行了,也不用现敲了,其实就是有点懒.... 具体解释都在代码里有解释 直接上代码了: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queue>

C语言--折半法的问题,求大神指点

问题描述 C语言--折半法的问题,求大神指点 对于某公司的职工进行工资排序,且用折半法找到指定的职工 #include<string.h> #define M 3 void inputName(char name[][121],double money[]); void ouput(char name[][121],double money[]); void sortPay(char name[][121],double money[]); void sortName(char name[][

图片-有关C语言辗转相除法求最大公约数的问题

问题描述 有关C语言辗转相除法求最大公约数的问题 系统没有提示有问题 但是运行的时候没有结果出来 想请问下问题出在哪里了?谢谢! 解决方案 你有没有发现你while里面只要c不为零就会一直循环赋值下去?你应该把对取余放到循环内 解决方案二: 用辗转相除法求最大公约数 算法描述: m对n求余为a, 若a不等于0 则 m <- n, n <- a, 继续求余 否则 n 为最大公约数 最小公倍数 = 两个数的积 / 最大公约数 #include int main() { int m, n; int

C - Line——(扩展欧几里得算法)

传送门 C. Line time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output A line on the plane is described by an equation Ax + By + C = 0. You are to find any point on this line, whose coordinates are in