记一种求最大公约数的方法

除了短除,还有下面两种方法求最大公约数,不但在数学中显得简单,而且在编程中有很好的效果

尤其是特别适合于编程。。。

先放文字说明:

1、更相减损法

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。

则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。

其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。

2、辗转相除法

欧几里德算法:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。

(看这样来说如果写代码就用递归喽?)

如果你是做数学题,可以参考下面解法:

1、更相减损法

情况1、用更相减损术求98与63的最大公约数。

解:由于63不是偶数,把98和63以大数减小数,并辗转相减:

98-63=35

63-35=28

35-28=7

28-7=21

21-7=14

14-7=7

所以,98和63的最大公约数等于7。

情况2、用更相减损术求260和104的最大公约数。

解:由于260和104均为偶数,首先用2约简得到130和52,再用2约简得到65和26。

此时65是奇数而26不是奇数,故把65和26辗转相减:

65-26=39

39-26=13

26-13=13

所以,260与104的最大公约数等于13乘以第一步中约掉的两个2,即13*2*2=52。

2、辗转相除法

例如,求(319,377):

∵ 319÷377=0(余319)

∵ 377÷319=1(余58)

∵ 319÷58=5(余29),

∵ 58÷29=2(余0),

所以答案就是29.

如果你是程序员(而且准备刷题):

推荐第二种方法:

int getGCD_PlanB(int dwValue1,int dwValue2)
/*
 Suggested by MorningFrst
 Article Address: http://www.cnblogs.com/MorningFrst/p/5884696.html
 */
{
    int dwBuffer;
    if(dwValue1>dwValue2)
    {
        dwBuffer=dwValue1;
        dwValue2=dwValue1;
        dwValue1=dwBuffer;
        //做数值交换,使从小到大排序
    }
    while(dwValue1!=0)
    {
        dwBuffer=dwValue2%dwValue1;
        dwValue2=dwValue1;
        dwValue1=dwBuffer;
        //反复相除,交换被除数 除数
    }
    return dwValue2;
}
时间: 2024-11-02 09:10:25

记一种求最大公约数的方法的相关文章

论求最大公约数的方法

求最大公约数实际上是一个非常简单的问题,但是在ACM中如何将效率搞的最高也需要一点点技巧.下面将今天收集到的一点资料粘贴在此处. 书上是说: 1.输入m.n(m为被除数,n为除数)2.m/n得余数r.3.判断r=0?是的话n为最大公约数.4.否则将n赋给m,r赋给n,循环2. 辗转相除法:如: 求(45, 72) 72/45 = 1 余 27 不等于0,再除45 /27= 1 余 18 不等于0,再除27/18= 1 余 9 不等于0,再除18/9 = 2 余 0 等于0,结束. 所以 (45,

求最大公约数和最小公倍数

学习C++入门级的题目,求最大公约数和最小公倍数,这里介绍两种求最大公约数的方法,即辗转相除法和辗转相减法.辗转相除法的原理自行百度,辗转相减法的原理就是只要两数不想等就用大数减小数,直至相等,求最小公倍数的方法就是用两数的乘积除以最大公约数. #include<iostream> using namespace std; int maxf(int a,int b)//辗转相减法 { while(a != b) { if(a > b) return a = a - b; else ret

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

下面是四种用java语言编程实现的求最大公约数的方法: package gcd; import java.util.ArrayList; import java.util.List; public class gcd { public static void main(String[] args) { long startTime; long endTime; long durationTime; int[] testArray1 = new int[]{784, 988, 460, 732,

各种求最大公约数的函数

GCD 求最大公约数函数 方法总结 递归版 int gcd(int x, int y) { if(y==0) return x; return gcd(y, x%y); } 简介递归版 int gcd(int x, int y) { return y>0? gcd(y, x%y) : x; } 非递归版 int gcd(int x, int y) { int tmp; while(y>0) { tmp=x%y; x=y; y=tmp; } return x; } \(algorithm.h\)

求最大公约数的三种方法

一.最大公约数与最小公倍数 最大公约数,属于数论所探究的内容. 最大公约数可以通过下面的三种方法求出来. 最小公倍数呢,它与最大公约数的乘机为所求数之积. 比如求  x,y的最大公约数和最小公倍数 记住这个公式: x*y=最小公倍数*最大公约数 二.求最大公约数的三种方法 ①辗转相除法 算法流程图 int measure(int x, int y) { int z = y; while(x%y!=0) { z = x%y; x = y; y = z; } return z; } 运行结果: ②辗

求最大公约数的几种算法分析

题目--求两个整数的最大公约数 思路1.穷举算法 public static voidmain(String[] args) throws IOException { Scannerscanner = new Scanner(System.in); inta = scanner.nextInt(); intb = scanner.nextInt(); System.out.println("开始时间是"+System.currentTimeMillis()); System.out.p

求两个数的最大公约数的方法

对于两个整数x,y,求其最大公约数(语言:C,C++) 原理:辗转除法求最大公约数:就是不断的用除数去除以余数,直到余数为0 ,最终得到的除数就是该两个数的最大公约数 1.递归法: int gcd(int x,int y) { int result; if(y==0) result=x; else result=gcd(y,x%y); return result; } 2.非递归法(辗转相除法) int gcd(int x,int y) {//辗转除法求最大公约数:就是不断的用除数去除以余数,直

最简单的求最大公约数和最小公倍数的方法

public class Main{  /**   * @param args   */  public static void main(String[] args) {   // TODO Auto-generated method stub   Scanner scan = new Scanner(System.in);   int n,m;   while(scan.hasNext()){    n = scan.nextInt();    m = scan.nextInt();    

C语言——求最大公约数及最小公倍数

基本概念 最小公倍数:两个或多个整数公有的倍数叫做它们的公倍数.整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号. 最大公约数:也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号. 关于最小公倍数与最大公约数,我们有这样的定理:(a,b)[a,b]=ab(a,b均为整数). 方法分析 最大公