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

标签: 递归 递推 gcd
9940人阅读 评论(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;
}


查看评论

GCD算法

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

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

GCD(Great Common Divisor)算法,即所谓最大公约数算法,也称为HCF(Highest Common Factor)算法。而所谓的最大公约数,指的是几个整数中共有约数中最大的一个。...
  • Linoi
  • Linoi
  • 2014-02-13 18:00:59
  • 3508

快速GCD算法

遇到GCD(最大公约数)问题的同学可能回想到以下这个算法,这种方法理解起来没有太大的难度,并且原理为大家所熟知的辗转相除法,算法的C++实现如下: int GCD(int a, int b) { ...
  • m0_38081836
  • m0_38081836
  • 2017-09-21 16:30:22
  • 276

求最大公约数gcd算法

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

GCD常用函数说明

提交队列函数(即执行): dispatch_async(dispatch_queue_t queue, ^(void)block):异步执行队列 dispatch_sync(dispatch_que...
  • hcy_12345
  • hcy_12345
  • 2015-07-25 18:26:05
  • 1139

GCD函数简单总结

本博客转自-http://tutuge.me/2015/04/03/something-about-gcd/ dispatch_once_t必须是全局或者static变量 这一条算是“老生常谈”了...
  • SYH523364
  • SYH523364
  • 2016-03-21 14:59:49
  • 1223

关于gcd的函数和过程两种不同写法

没什么特别的,只是想记录一下不同的写法 函数(有返回值) #include using namespace std; int gcd(int x,int y) { if(x%y==0) retu...
  • yyyyyy11123
  • yyyyyy11123
  • 2017-05-29 11:54:56
  • 258

Object-C高级编程读书笔记(6)—— GCD的一些函数

Apple推荐使用GCD作为并发编程的选择,这里就总结一下常用的GCD函数。
  • u013378438
  • u013378438
  • 2016-04-29 07:55:06
  • 581

gcd和egcd算法

欧几里德算法(gcd)又称辗转相除法,用于计算两个整数a,b的最大公约数。 基本思路:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,...
  • qq_31798427
  • qq_31798427
  • 2017-02-19 09:36:23
  • 2583
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 115万+
    积分: 2万+
    排名: 312
    文章分类
    博客专栏
    最新评论