关闭

最大公约数GCD的三种算法程序

标签: 递归递推gcd
7410人阅读 评论(1) 收藏 举报
分类:

Greatest Common Divisor(GCD)

欧几里得算法据说是最早的算法,用于计算最大公约数,也是数论的基础算法之一。

这里给出使用欧几里得算法求最大公约数的递归和非递归的程序,同时给出穷举法求最大公约数的程序。

从计算时间上看,递推法计算速度最快。

程序中包含条件编译语句用于统计分析计算复杂度。

/*
 * 计算两个数的最大公约数三种算法程序
 */

#include <stdio.h>

//#define DEBUG
#ifdef DEBUG
int c1=0, c2=0, c3=0;
#endif

int gcd1(int, int);
int gcd2(int, int);
int gcd3(int, int);

int main(void)
{
    int m=42, n=140;

    printf("gcd1: %d %d result=%d\n", m, n, gcd1(m, n));
    printf("gcd2: %d %d result=%d\n", m, n, gcd2(m, n));
    printf("gcd3: %d %d result=%d\n", m, n, gcd3(m, n));
#ifdef DEBUG
    printf("c1=%d  c2=%d  c3=%d\n", c1, c2, c3);
#endif

    return 0;
}

/* 递归法:欧几里得算法,计算最大公约数 */
int gcd1(int m, int n)
{
#ifdef DEBUG
    c1++;
#endif
    return (m==0)?n:gcd1(n%m, m);
}

/* 迭代法(递推法):欧几里得算法,计算最大公约数 */
int gcd2(int m, int n)
{
    while(m>0)
    {
#ifdef DEBUG
    c2++;
#endif
        int c = n % m;
        n = m;
        m = c;
    }
    return n;
}

/* 连续整数试探算法,计算最大公约数 */
int gcd3(int m, int n)
{
    if(m>n) {
        int temp = m;
        m = n;
        n = temp;
    }
    int t = m;
    while(m%t || n%t)
    {
#ifdef DEBUG
    c3++;
#endif
        t--;
    }
    return t;
}

关键代码(正解):

/* 迭代法(递推法):欧几里得算法,计算最大公约数 */
int gcd(int m, int n)
{
    while(m>0)
    {
        int c = n % m;
        n = m;
        m = c;
    }
    return n;
}


6
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

GCD算法(最大公约数算法)解析

GCD(Great Common Divisor)算法,即所谓最大公约数算法,也称为HCF(Highest Common Factor)算法。而所谓的最大公约数,指的是几个整数中共有约数中最大的一个。如果数A可被M整除,则M就是A的约数(因数),那么如果数A、 B、 C都可被M整除,且M是可以整除这...
  • Linoi
  • Linoi
  • 2014-02-13 18:00
  • 2523

GCD算法

网上代码多的是,我只是记下来而已 基础 int gcd(int a,int b) { int r; while(b>0) { r=a%b; a=b; b=r; } return a; } ...
  • Niteip
  • Niteip
  • 2014-02-19 10:17
  • 6599

GCD常用函数说明

提交队列函数(即执行): dispatch_async(dispatch_queue_t queue, ^(void)block):异步执行队列 dispatch_sync(dispatch_queue_t queue, ^(void)block) :同步执行队列(主线程) 获取queue函...
  • hcy_12345
  • hcy_12345
  • 2015-07-25 18:26
  • 955

最大公约数GCD

GCD:Greatest Common Divisor.欧几里德算法(Euclid)阐述了一种求gcd的算法。 根据:gcd递归定理,即gcd(a,b) = gcd (b,a mod b)。
  • yeruby
  • yeruby
  • 2015-06-15 09:41
  • 403

求最大公约数gcd算法

求两个正整数a,b最大公约数方法较常用的是欧几里得提出的辗转相除法 假设a=b*k+r …….(1),则gcd(a,b)=gcd(b,r)…….(2); 证明: 设c=gcd(a,b),则a=c*n, b=c*m 根据上式(1) r=a-b*k=c*n-c*m*k=(n-m*k)*c 此...
  • GaoShan1011
  • GaoShan1011
  • 2016-09-21 16:57
  • 369

4-4 使用函数求最大公约数 (10分)

本题要求实现一个计算两个数的最大公约数的简单函数。 函数接口定义: int gcd( int x, int y ); 其中x和y是两个正整数,函数gcd应返回这两个数的最大公约数。 裁判测试程序样例: #include int gcd( int x, int y ); int ...
  • qq_36630770
  • qq_36630770
  • 2017-03-01 19:59
  • 2892

gcd的递归表现形式

int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } 这应该是最简单明了的表现方式了。
  • luojiayu14
  • luojiayu14
  • 2011-12-21 18:44
  • 2261

多线程编程4 - GCD

一、简介 在iOS所有实现多线程的方案中,GCD应该是最有魅力的,因为GCD本身是苹果公司为多核的并行运算提出的解决方案。GCD在工作时会自动利用更多的处理器核心,以充分利用更强大的机器。GCD是Grand Central Dispatch的简称,它是基于C语言的。如果使用GCD,完全由系统管理线...
  • q199109106q
  • q199109106q
  • 2013-02-03 00:26
  • 71823

浅谈扩欧及exgcd对二元不定方程求解问题

今天模拟赛第一题是一道对欧几里得和扩欧算法的简单应用,可惜两种方法都不会的我只能用求导和最小矩阵来存不定方程在坐标系上的整数解,满打满算了七十多行代码,其实一个扩欧就能解决的问题,被我想的很复杂。所以,这就是数学结合信息学的恶心之处吧,所以多学学算法对自己还是有帮助的!(博主苦心孤诣地教导各位同学,...
  • Zctoylm
  • Zctoylm
  • 2017-08-09 22:29
  • 217

hihocoder 1297 数论四·扩展欧几里德(exgcd)

扩展欧几里德(exgcd)我一直学的不是太好,虽然中间的一些道理啊知道,但是每次碰到exgcd的题就都不会写,正负错啊,模错啊 今天小小总结下我自己的exgcd的经验把,不是讲原理,因为原理大家都看过很多,反正我记不住,套套模板就好了 首先一般都是构造ax+by=c,然后调用exgcd(a,b,d,...
  • Miracle_ma
  • Miracle_ma
  • 2016-05-16 16:05
  • 388
    个人资料
    • 访问:909491次
    • 积分:20720
    • 等级:
    • 排名:第452名
    • 原创:1086篇
    • 转载:87篇
    • 译文:0篇
    • 评论:403条
    文章分类
    博客专栏
    最新评论