最大公约数 / 最小公倍数
最大公约数定义: 也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b 的最大公约数记为(a,b),同样的,a,b,c 的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。
求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。
最小公倍数定义:两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。整数a,b的最小公倍数记为[a,b],同样的,a,b,c 的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号。
质因数分解法:
把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是这几个数的最大公约数。例如:求24和60的最大公约数,先分解质因数,得24=2×2×2×3,60=2×2×3×5,24与60的全部公有的质因数是2、2、3,它们的积是2×2×3=12,所以,(24,60)=12。
分解质因数:每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。如30=2×3×5 。分解质因数只针对合数。
质数:是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。0 和 1 不是质数。
把几个数先分别分解质因数,再把各数中的全部公有的质因数和独有的质因数提取出来连乘,所得的积就是这几个数的最小公倍数。例如:求6和15的最小公倍数。先分解质因数,得6=2×3,15=3×5,6和15的全部公有的质因数是3,6独有质因数是2,15独有的质因数是5,2×3×5=30,30里面包含6的全部质因数2和3,还包含了15的全部质因数3和5,且30是6和15的公倍数中最小的一个,所以[6,15]=30。
短除法:
辗转相除法:求两个自然数的最大公约数的一种方法,也叫欧几里得算法。
两数相除,用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。最小公倍数就是这两个数分别除所求得的最大公约数的商相乘再乘最大公约数,即 [a/gcd(a, b)] * [b*gcd(a, b)] * gcd(a, b)
例:
求(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。
用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。
算法实现:
int gcd(int a, int b){if(a % b == 0) return b;return gcd(b, a%b); }
int gcd(int a, int b){return b==0 ? a : gcd(b, a%b); }
更相减损法: 也叫更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。
《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
翻译成现代语言如下:
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。
例1.用更相减损术求98与63的最大公约数。解:由于63不是偶数,把98和63以大数减小数,并辗转相减: 98-63=35 63-35=28 35-28=7 28-7=21 21-7=14 14-7=7 所以,98和63的最大公约数等于7。 这个过程可以简单的写为: (98,63)=(35,63)=(35,28)=(7,28)=(7,21)=(7,14)=(7,7)=7.
例2.用更相减损术求260和104的最大公约数。解:由于260和104均为偶数,首先用2约简得到130和52,再用2约简得到65和26。 此时65是奇数而26不是奇数,故把65和26辗转相减: 65-26=39 39-26=13 26-13=13 所以,260与104的最大公约数等于13乘以第一步中约掉的两个2,即13*2*2=52。 这个过程可以简单地写为: (260,104)(/2/2) =>(65,26)=(39,26)=(13,26)=(13,13)=13. (*2*2) => 52
算法实现:
#include<iostream> #include<cmath> using namespace std; int t = 0; int gcd(int a, int b, int c){if(b == c) return b;while(a%2==0 && b%2==0){a /= 2; b /= 2;t++;}c = abs(a-b);a = max(b, c);b = min(b, c);gcd(a, b, a-b); } int main(){int a, b;cin >> a >> b;cout << gcd(a, b, 0) * pow(2, t);return 0; }
#include<cstdio> #include<cmath> int gcd(int a , int b , int t){if(a==0) return b;if(b==0) return a;if(a%2==0 && b%2==0){t++;return gcd(a/2 , b/2 , t);}else{if(a>b){return gcd(a-b,b,t);}else if(a<b){return gcd(a,b-a,t);} else if(a==b){return a*pow(2,t);}} } int main(){int a , b , t=0;scanf("%d %d", &a , &b); printf("%d",gcd(a , b , t));return 0; }
关于最小公倍数与最大公约数,我们有这样的定理:(a,b)x[a,b]=ab (a,b均为整数)。
最大公约数 / 最小公倍数相关推荐
- ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数
题目描述 写两个函数,分别求两个整数的最大公约数和最小公倍数, 用主函数调用这两个函数,并输出结果两个整数由键盘输入. 输入 两个数 输出 最大公约数 最小公倍数 样例输入 6 15 样例输出 3 3 ...
- 每日算法练习之最大公约数最小公倍数
利用辗转相除判断最大公约数 最小公倍数 //2016-8-22题目:输入两个正整数m和n,求其最大公约数和最小公倍数. //1.程序分析:利用辗除法. public class GcdTest {p ...
- 最大公约数,最小公倍数,质因式分解
目录 简单代码算出最大公约数,最小公倍数: 辗转相除法得到最大公约数: 两数相乘倒序最小公倍数: 分解质因式, 打印输出, 并且存到列表 主程序: 由质因式得到最小公倍数: 简单代码算出最大公约数,最 ...
- 辗转相除求最大公约数最小公倍数 扩展欧几里得算法
最大公约数最小公倍数 #include<stdio.h>int gcd(int a, int b) {return (b ? gcd(b, a % b):a); }int lcm(int ...
- c++求几个数的最大公约数_最大公约数,最小公倍数 A3
点击上方"蓝字"关注,酷爽一夏最大公约数,最小公倍数 15.有三根小棒,分别长12 厘米.44 厘米.56 厘米.要把它们截成同样长的小棒,不许有剩余,每根小棒最长能有多少厘米?一 ...
- 数论相关_最大公约数最小公倍数
文章目录 最大公约数 Greatest Common Divisor 多个数的最大公约数 最小公倍数 Least Common Multiple 多个数的最小公倍数 Tag 最大公约数 Greates ...
- Python 最大公约数/最小公倍数算法
Python 最大公约数算法 最大公约数:能够同时被两个数整除的那个最大的数. #最大公约数 (穷举法) x,y = input().split() x,y = int(x),int(y) small ...
- C语言 | 最大公约数最小公倍数
例45:C语音编程实现求两个数的最大公约数和最小公倍数 解题思路:最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个:最小公倍数是指两个或多个整数公有的倍数叫做它们的公倍数, ...
- 【蓝桥java】进制与整除之最大公约数 最小公倍数
补充: (1)欧几里得定理(辗转相除法):A和B的最大公约数 = B和A%B 的最大公约数 (2)将两个数乘起来再除以最大公约数就是最小公倍数 package cn.zzunit.jnvi;/***寻 ...
- 最大公约数 最小公倍数
import java.util.Scanner; public class Zuida { public static void main(String[] args) { int a,b,c; S ...
最新文章
- plt.figure()的使用
- Tensorflow【实战Google深度学习框架】预训练与微调含代码(看不懂你来打我)
- Java vs Kotlin,Android开发人员应该选择哪种语言?
- spring + hibernate
- 0079-简单的循环
- centos部署python个人博客项目
- Java基础——虚拟机结构
- Chapter7-2_BERT and its family - Introduction and Fine-tune
- 与 python 交互
- (9)进程---JoinableQueue队列
- UITableView长按拖动排序(支持不同行高,不同section间交换)
- 用python画圣诞树-使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
- unity视频播放,
- Classic Shell 后继者之 Classic Start
- Android-2-控件使用
- Android仿淘宝京东商品规格参数颜色筛选
- FlyBanner轮播图 和 XBanner轮播图
- linux云自动化系统运维19(磁盘阵列raid,lvm管理)
- 利用 Python + Selenium 自动化快速截图
- 【考研数学】数一-数学概念anki卡片合集-547张-23000字-22电子科大考研上岸整理
热门文章
- java服务器端集成友盟,Android友盟推送集成
- 2019.11.2图论专题(AtCoder Splatter Painting、President and Roads、Shortest Cycle、ISlands II)
- 函数式接口 BiConsumer接口和Consumer接口
- 武汉市申请国家现代农业产业科技创新中心发展奖励标准及申请要求
- 阿里巴巴图标库的使用
- python --- 常见题目 2019.01.03
- 如何用matlab演奏《偏爱》
- upload-labs文件上传漏洞(Pass-01~Pass-21)
- 速看!没有比这更全面的 Firebase 介绍!
- 汉字编码中区位码、国标码和机内码的区别