千家信息网

C语言实现求最大公约数的方法有哪些

发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章主要介绍C语言实现求最大公约数的方法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!题目描述求任意两个正整数的最大公约数问题分析最大公因数,也称最大公约数、最大公因
千家信息网最后更新 2024年11月22日C语言实现求最大公约数的方法有哪些

这篇文章主要介绍C语言实现求最大公约数的方法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

题目描述

求任意两个正整数的最大公约数

问题分析

最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。

--百度百科

最大公因数的求法有不少,本文我将采用穷举法、辗转相除法、更相减损法三种方法,求两个正整数的最大公约数(最大公因数)。

代码实现

方法一:穷举法

穷举法(列举法),是最简单最直观的一种方法。

具体步骤为:先求出两个数的最小值min(最大公约数一定小于等于两个数的最小值),接着从最小值min递减遍历(循环结束条件为i > 0),如果遇到一个数同时为这两个整数的因数,则使用break退出遍历(退出循环),这时的遍历值i即为两个正整数的最大公约数。

#include /** * @brief 获取两个正整数的最大公因数(穷举法) * @param num1  第一个正整数 * @param num2  第二个正整数 * @return      最大公因数 */int Get_Max_Comm_Divisor(int num1, int num2){    int i = 0;    //获取两个整数的最小值    int min = num1 < num2 ? num1 : num2;    //从两个数的最小值开始递减遍历    for(i = min; i > 0; i--)    {        //i为num1和num2的公倍数        if(num1 % i == 0 && num2 % i == 0)            break;    }    return i;}int main(){    int num1 = 0, num2 = 0;    puts("请输入两个正整数.");    scanf("%d%d", &num1, &num2);    printf("最大公约数为%d.\n", Get_Max_Comm_Divisor(num1, num2));    return 0;}

运行结果

方法二:辗转相除法

辗转相除法又称欧几里得算法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。

.欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《The Elements》中最早描述了这种算法,所以被命名为欧几里得算法。

扩展欧几里得算法可用于RSA加密等领域。

举例:

假如需要求 1997 和 615 两个正整数的最大公约数,用欧几里得算法,是这样进行的:

1997 / 615 = 3 (余 152)

615 / 152 = 4(余7)

152 / 7 = 21(余5)

7 / 5 = 1 (余2)

5 / 2 = 2 (余1)

2 / 1 = 2 (余0)

至此,最大公约数为1

以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 1997 和 615 的最大公约数 1。

--百度百科

数学学渣的我觉得这个小算法特别神奇,但我并不想深入研究(为什么能用辗转相除求最大公因数呢),假如你想证明,可以自己试着简单地证明一下,我就直接选择强记了,嘿嘿。

虽然算法不好理解,但实现过程并不算难,按照辗转相除的概念,转换成代码即可。

具体步骤:先求出两个数num1和num2的余数remainder。然后将num2赋值给num1,让上次取余时的除数num2作为下次取余时的被除数。同时将当前的余数remainder作为下次取余的除数。这样一直地辗转相除,直到余数为0,这时的除数num2就是我们要求的最大公因数。

一开始两个数不需要区分大小,因为如果num1比num2小,那么取余的结果还是num1,这样下次取余就变成了num2 % num1,即大的值在左边,作为被除数)

#include /** * @brief 获取两个正整数的最大公因数(辗转相除法) * @param num1  第一个正整数 * @param num2  第二个正整数 * @return      最大公因数 */int Get_Max_Comm_Divisor(int num1, int num2){    int remainder = num1 % num2;  //余数    while(remainder != 0)    {        num1 = num2;      //更新被除数        num2 = remainder; //更新除数        remainder = num1 % num2; //更新余数    }    return num2;  //最后的除数即为最大公因数}int main(){    int num1 = 0, num2 = 0;    puts("请输入两个正整数.");    scanf("%d%d", &num1, &num2);    printf("最大公约数为%d.\n", Get_Max_Comm_Divisor(num1, num2));    return 0;}

运行结果

方法三:更相减损法

《九章算术》是中国古代的数学专著,其中的"更相减损术"可以用来求两个数的最大公约数,原文是:

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。

白话文译文:

(如果需要对分数进行约分,那么)可以折半的话,就折半(也就是用2来约分)。如果不可以折半的话,那么就比较分母和分子的大小,用大数减去小数,互相减来减去,一直到减数与差相等为止,用这个相等的数字来约分。

--百度百科

还有一种叫辗转相减的方法,好像和更相减损法相同,至少原理是一样的。

辗转相减法(求最大公约数),即尼考曼彻斯法,其特色是做一系列减法,从而求得最大公约数。例如 :两个自然数35和14,用大数减去小数,(35,14)->(21,14)->(7,14),此时,7小于14,要做一次交换,把14作为被减数,即(14,7)->(7,7),再做一次相减,结果为0,这样也就求出了最大公约数7。

--百度百科

刚才的辗转相除已经让我很吃惊了,没想到相减的方法。不过还是老规矩,直接用代码去实现这个方法,而不去证明。

不同于辗转相除法,更相减损法是需要考虑两个数的大小的,只能用大的数作为被减数,小的作为减数。

实现步骤:首先求出两个正整数num1和num2的差值diff,然后将num2赋值给num1,让上次相减时的减数num2作为下次相减时的被减数。同时将当前的差值diff作为下次相减的减数。这样一直地辗转相减,直到差值为0,这时的除数num2就是我们要求的最大公因数。

#include /** * @brief 获取两个正整数的最大公因数(更相减损法) * @param num1  第一个正整数 * @param num2  第二个正整数 * @return      最大公因数 */int Get_Max_Comm_Divisor(int num1, int num2){    //两数相减的结果(取正值)    int diff = num1 > num2 ? num1 - num2 : num2 - num1;    while(diff != 0)    {        num1 = num2;   //更新被减数        num2 = diff; //更新减数        diff = num1 > num2 ? num1 - num2\               : num2 - num1; //更新两数相减的结果(取正值)    }    return num2;  //最后的减数即为最大公因数}int main(){    int num1 = 0, num2 = 0;    puts("请输入两个正整数.");    scanf("%d%d", &num1, &num2);    printf("最大公约数为%d.\n", Get_Max_Comm_Divisor(num1, num2));    return 0;}

运行结果

以上是"C语言实现求最大公约数的方法有哪些"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

最大 公约数 最大公约数 两个 整数 公因数 方法 算法 除数 余数 结果 最小 减数 辗转相除法 欧几 欧几里得 里得 更新 百科 被减数 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 怀旧服联盟如何增加服务器人口 个人电脑装数据库会影响性能吗 服务器怎么开启安全 网络安全学校 echart大屏展示 数据库 杭州web前端软件开发怎么样 mssql数据库角色 模拟点阵显示软件开发 数据库怎么创建数据 美团网络安全吗 学网络安全做最in的it新贵 接口可以用在服务器上吗 网络安全工作的目标包括什么 珠海网络安全会议 绝地逃生东南亚服务器 数据库开发程序中文正式版 荆门市风愈网络技术 国产网络安全整机厂家 涪陵区一站式软件开发服务代理商 南阳网络技术有限公司怎么样 魔兽世界联盟卡在服务器怎么办 企业网络技术维护合同文书 戈星互联网科技有限公司 jdbc创建数据库 c ado 连接数据库 计算机网络技术基础实训体会 为什么注册qq服务器发不过去 赛迪研究院网络安全研究所王超 下面那个不是数据库系统必须提供 mac修复代理服务器设置
0