C:求两个数的最大公约数详解(硬核算法,辗转相除法,更相减损法)
最大公因数,也称最大公约数、最大公因子。
定义:
指两个或多个整数共有约数中最大的一个。
a,b的最大公约数 记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。
求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。
解法一:最普通的算法(十分硬核)
程序代码:
int main()
{int i, a, b;int max = 1, min;printf("请输入两个数:");scanf("%d%d", &a, &b);if (a > b) //判断输入两个个数的大小{min = b;}else{min = a;}for (i = 2; i <= min; i++){if (a%i == 0 && b%i == 0){max = i;}else{continue;}}printf("最大公约数是%d\n", max);system("pause");return 0;
}
质因数分解法:
把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。
例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24,60)=12。
把几个数先分别分解质因数,再把各数中的全部公有的质因数和独有的质因数提取出来连乘,所得的积就是这几个数的最小公倍数。
但是质因数分解法有一个最大的缺陷:分解质因数只针对合数。
所以此博客不讨论!因为用户输入的时候不一定清楚输入的数是不是合数!
短除法:
短除法求最大公约数,先用这几个数的公约数连续去除,一直除到所有的商互质为止,然后把所有的除数连乘起来,所得的积就是这几个数的最大公约数。
短除法的本质就是质因数分解法。所以此博客不讨论!
解法二:辗转相除法
辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
例如:求(319,377):
∵ 319÷377=0(余319)
∴(319,377)=(377,319);
∵ 377÷319=1(余58)
∴(377,319)=(319,58);
∵ 319÷58=5(余29)
∴ (319,58)=(58,29);
∵ 58÷29=2(余0)
∴ (58,29)= 29;
∴ (319,377)=29。
用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。
程序代码:
#include<stdio.h>
#include<stdlib.h>int main()
{int a, b, c;printf("请输入两个数:");scanf("%d%d", &a, &b);while ( c=a % b ){a = b;b = c;}printf("最大公约数是%d\n", b);system("pause");return 0;
}
代码生成图:
解法三:更相减损法
更相减损法:也叫更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。
《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
翻译成现代语言如下:
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。
程序代码:
#include<stdio.h>
#include<stdlib.h>int main(){int a, b;int count = 1;printf("请输入两个数:");scanf("%d%d", &a, &b);while (a % 2 == 0 && b % 2 == 0) {a /= 2;b /= 2;count *= 2;}while (a != b){if (a > b)a -= b;elseb -= a;}printf("最大公约数是%d\n", b*count);system("pause");return 0;
}
C:求两个数的最大公约数详解(硬核算法,辗转相除法,更相减损法)相关推荐
- 辗转相除法+更相减损法求最大公约数
怎么求两个数的最大公约数呢? 简单的想法就是直接暴力枚举,试出最大公约数 #暴力枚举 #暴力枚举 def GCD(numberA,numberB):gcd=1for i in range(2,max( ...
- 最大公约数算法_更相减损法_辗转相除法(即欧几里得算法)
package algorithm;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...
- 求最大公约数与最小公倍数 (辗转相除法+更相减损法+Stein算法)
辗转相除法与更相减损法对比: (1)两者都是求最大公因数的方法,计算上辗转相除法以除法为主,更相减损术以减法为主,计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显 ...
- C语言:求最大公约数-更相减损法(循环自定义函数的定义与调用)
又是王老师的一道练习题: 任务描述 1.任意给定两个正整数:判断它们是否都是偶数.若是,则用2约简:若不是则执行第二步: 2.以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数.继续这 ...
- C语言实现辗转相除法和更相减损法求两数最大公约数,及求最小公倍数的方法
在学习从C语言过程中,我们会遇到一个题目,求两个整数的最大公约数,那么接下来分别介绍两种方法求最大公约数 1,辗转相除法 辗转相除法, 又名欧几里德算法(Euclidean Algorithm),是求 ...
- 辗转相除法和更相减损法-详解——求最大公约数(Java)
辗转相除法 简介:辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求两个正整数之最大公约数的算法. 原理:两个数的最大公约数等于它们中较小的数和两数之差的最大公约数. 操作 ...
- C++ 求最大公约数 更相减损法 欧几里得算法 暴力穷举法
两个数的最大公约数是指能同时被他们整除的最大正整数. 两个数的最大公约数等于它们中 较小的数 和 两数之差 的最大公约数. 252和105的最大公约数是21(252 = 21 × 12:105 = 2 ...
- 求最大公约数和最小公倍数(更相减损法/辗转相除法)
目录 一.最大公约数 1.1 更相减损法 1.2 辗转相除法 二.最小公倍数 2.1 最小公倍数=两数相乘/最大公约数 2.2 用较小数的倍数除以较大数 一.最大公约数 1.1 更相减损法 原理如下图 ...
- 更相减损法(求最大公约数)
算法本质: 第一步:任意给定两个正整数:判断它们是否都是偶数.若是,则用2约简:若不是则执行第二步.第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数.继续这个操作,直到所得的 ...
最新文章
- 自动驾驶技术之——虚拟场景数据库研究
- RDB和AOF的持久化配置
- C# 重绘tabControl,添加关闭按钮(续)
- MDK寄存器地址映射分析
- Ajax_ASP.NET 添加 Ajax 和客户端功能_01
- java rgb转yuv_【转】总结各种RGB转YUV的转换公式
- Docker Compose 项目
- nginx优化(经典)
- 正则表达式替换和不包含指定字符串
- python输出重定向记录
- 2014年前端开发者如何提升自己
- mac memcached_如何在Mac OS上安装Memcached Server
- nbu备份nas文件服务器,NBU网络备份大全之远程配置备份策略
- web性能压力测试工具
- android常用的混淆规则,关于Android混淆的基本做法
- springboot word excel ppt 图片aspose 转换PDF 在线预览
- 台式计算机无法访问网络,台式机关机导致局域网内LAN设备无法连接网络
- FT1248程序(FT232H,FT220X)
- 扩展CKEditor按钮
- 通过javax.mail发送邮件(示例gmail、qq)