两个正整数的最大公约数(Greatest Common Divisor, GCD)是能够整除这两个整数的最大整数。两个正整数的最大公约数的求法有多种解答,本文就三种方法做详细介绍:穷举法欧几里得算法(辗转相除法)递归方法

我们从一道问题来引入:编写计算最大公约数的函数Gcd(),在主函数中调用该函数计算并输出从键盘任意输入的最大公约数。

目录

1.穷举法

2.欧几里得算法(辗转相除法)

3.递归方法


1.穷举法

根据最大公约数的定义,我们可以采用一种最简单的方法——穷举法来编写代码。由于a和b的最大公约数不可能比a和b中的较小者还大,否则一定不能整除它,因此,先找到a和b中的较小者t,然后从t开始逐次减1尝试每种可能,即检验t到1之间的所有整数,第一个满足公约数条件的t,就是a和b的最大公约数。据此我们可编写函数Gcd()如下:

//函数功能:计算a和b的最大公约数,输入负数时返回-1
int Gcd(int a, int b)
{int i, t;if (a <=0 || b <= 0)return -1;t = a < b ? a : b;for (i=t; i>0; i--){if (a%i==0 && b%i==0)return i;}return 1;
}

这种方法简单暴力,思维量小,但效率较低,且当两个正整数都较大,且最大公约数为1时,循环的次数为较小数的值,可想而知所需时间会很长。


2.欧几里得算法(辗转相除法)

下面介绍一种求最大公约数较常用的办法:欧几里得算法(辗转相除法)

忽略数学原理,我们有如下算法:对正整数a和b,连续进行求余运算,直到余数为0为止,此时非0的除数就是最大公约数。设 r=a mod b 表示a除以b的余数,若 r≠0 ,则将b作为新的a,r作为新的b,重复 a mod b 运算,直到 r=0 为止,此时b为所求的最大公约数。例如,50和15的最大公约数的求解过程可表示为:Gcd(50, 15)=Gcd(15, 5)=Gcd(5, 0)=5。

用这种算法可编写函数Gcd()如下:

//函数功能:计算a和b的最大公约数,输入负数时返回-1
int Gcd(int a, int b)
{int r;if (a <= 0 || b <= 0)return -1;do{r = a % b;a = b;b = r;} while (r != 0);return a;
}

我们也可以考虑使用递归实现如下:

//函数功能:计算a和b的最大公约数,输入负数时返回-1
int Gcd(int a, int b)
{if (a <= 0 || b <= 0)return -1;if (a % b == 0)return b;elsereturn Gcd(b, a % b);
}

3.递归方法

对于最大公约数,还有3条性质:

性质1 如果 a>b,则a和ba-b和b的最大公约数相同;

性质2 如果 b>a,则a和ba和b-a的最大公约数相同;

性质3 如果 a=b,则a和b的最大公约数与a值和b值相同。

对正整数a和b,当 a>b 时,若a中含有与b相同的公约数,则a中去掉b后剩余的部分a-b中也应含有与b相同的公约数,对a-b和b计算公约数就相当于对a和b计算公约数。反复使用最大公约数的3条性质,直到a和b相等为止,这时,a或b就是它们的最大公约数。

这就是所谓的第三种方法:递归方法。虽然此法被称为递归方法,但只是思想方法运用了递归的方法,并不代表只能使用递归实现。我们同样可以通过非递归和递归两种手段编写函数Gcd()。非递归实现如下:

//函数功能:计算a和b的最大公约数,输入负数时返回-1
int Gcd(int a, int b)
{if (a <= 0 || b <= 0)return -1;while (a != b){if (a > b)a = a - b;else if (b > a)b = b - a;}return a;
}

编写递归函数如下:

//函数功能:计算a和b的最大公约数,输入负数时返回-1
int Gcd(int a, int b)
{if (a <= 0 || b <= 0)return -1;if (a == b)return a;else if (a > b)return Gcd(a-b, b);elsereturn Gcd(a, b-a);
}

以上就是三种计算最大公约数的算法,可使用如下主函数来调用函数Gcd(),计算最大公约数:

#include <stdio.h>
int Gcd(int a, int b);
int main(void)
{int a, b, c;printf("Input a,b:");scanf("%d,%d", &a, &b);c = Gcd(a,b);if (c != -1)printf("Greatest Common Divisor of %d and %d is %d\n", a, b, c);elseprintf("Input number should be positive!\n");return 0;
}

求两个正整数的最大公约数的过程,实质上是使用最大公约数的定义及性质求解的过程,对此感兴趣的伙伴们可以自己研究相关数学原理与证明。


参考文献:

苏小红 王甜甜 赵玲玲 范江波 车万翔 等编著 王宇颖 主审,C语言程序设计学习指导(第4版),高等教育出版社,P57-60.

C语言丨求两个正整数的最大公约数相关推荐

  1. php怎么求最小公倍数,C++_详解C语言求两个数的最大公约数及最小公倍数的方法,求两个正整数的最大公约数nbs - phpStudy...

    详解C语言求两个数的最大公约数及最小公倍数的方法 求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y) ...

  2. c语言求出两个最大素数,求两个正整数的最大公约数      思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法。通式分别为 f(x, y) = f(y, x%y...

    求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) ( ...

  3. 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数

    第二次作业 题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整 ...

  4. 求两个正整数的最大公约数和最小公倍数

    基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整数最大公约数问题. 2.求3个正整数的最大公约数和最小公倍 ...

  5. C语言:求两个整数的最大公约数

    /*求两个整数的最大公约数*/ /* 两个整数的最大公约数是能够同时整除他们的最大正整数.可以用辗转相除法,又称欧几里得算法. 原理如下:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约 ...

  6. 【算法】求两个正整数的最大公约数和最小公倍数

    题目 输入两个正整数m和n,求其最大公约数和最小公倍数. public class Prog6{public static void main(String[] args){int m,n;try{m ...

  7. 【C语言】求两个整数的最大公约数和最小公倍数,用一个函数求最大公约数。用另一个函数根据求出的最大公约数求最小公倍数。

    程序如下.思路:编写一个有返回值的函数,使用辗转相除法求两数最大公约数:再编写一个有返回值的函数根据公式(最小公倍数=两数之积除以两数的最大公约数)求两数最小公倍数. #include<stdi ...

  8. 求两个正整数的最大公约数 C语言

    算法,采用辗转相除法求最大公约数. (1)输入两个整数数m和n (2) m%n余数为r,然后m=n;n=r; (3)当n=0,则m是最大公约数,算法结束,否则转至执行(2)重复上述过程,直至n=0为止 ...

  9. 欧几里得算法求两个正整数的最大公约数

    此题可以使用暴力破解法解决,但是效率不高. 欧几里德算法又称辗转相除法,其计算原理依赖于下面的定理: gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)   ...

最新文章

  1. 《新一代城市大脑建设与发展》专家研讨会在京举办(新版)
  2. 每日一皮:开会不关微信的尴尬(1)
  3. python好还是c+-嵌入式系统中,Python与C/C++哪方更为适用?
  4. [題解](最小生成樹)luogu_P2916安慰奶牛
  5. 菜鸟网络 | 寄件业务的产品逻辑
  6. python新人绘图_【python 【分享】 爬取一些二刺螈图片 (新手作图)
  7. select 和epoll模型区别
  8. mysql 5.5 udf_MYSQL5漏洞之udf提权
  9. linux内核killler,Linux内核参数overcommit_memory和OOM killer介绍
  10. c语言函数写巴德歌赫猜想,{转帖}我们还有创造力么
  11. android 7.0原生动态,Android7.0适配教程,心得
  12. ie显示的html页面乱码,IE10、IE11页面中文乱码解决方案
  13. Magisk root 原理分析之一 :Magisk Andorid Root 流程
  14. 批量打印证书 php,巧用WPS2013批量打印证书
  15. 【Adobe Premiere Pro 2020】ps图稿导出到pr创建运动图形、pr音频录制与音频效果使用说明、pr导出为mp4格式及参数设置说明【包含其他几种常见格式】、pr去水印的4种方法说明
  16. 2021春节档电影数据分析
  17. Python自动化办公:ppt文件操作教程
  18. (六) 自己写简单的u-boot
  19. 平克四部曲之《白板》
  20. D2. Chopping Carrots (Hard Version) (每日一题)

热门文章

  1. 寻路优化(一)——二维地图上A*启发函数的设计探索
  2. Eclipse中文显示乱码问题
  3. Java面向对象之成员变量的初始值、object类与对象
  4. 07:有趣的跳跃【一维数组】
  5. 加速收敛_引入Powerball 与动量技术,新SGD优化算法收敛速度与泛化效果双提升 | IJCAI...
  6. Python基于用户协同过滤算法电影推荐的一个小改进
  7. Python编程一定要注意的那些“坑”(六)
  8. Python实现中英文分词
  9. SIFT特征提取分析(一)
  10. mysql 数据库连接 w3school_PHP 连接 MySQL