最大公约数&最小公倍数
最大公约数
如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
整除
若整数b除以非零整数a,商为整数,且余数 为零, 我们就说b能被a整除(或说a能整除b),b为被除数,a为除数,即a|b(“|”是整除符号),读作“a整除b”或“b能被a整除”。a叫做b的约数(或因数),b叫做a的倍数。
辗转相除法
又叫【欧几里德算法】
用较大的数除以较小的数,上面较小的除数和得出的余数构成新的一对数,继续做上面的除法,直到出现能够整除的两个数,其中较小的数(即除数)就是最大公约数
代码
/* 欧几里德算法:辗转求余 原理: gcd(a,b)=gcd(b,a mod b) 当b为0时,两数的最大公约数即为a getchar()会接受前一个scanf的回车符 */ #include<stdio.h> unsigned int Gcd(unsigned int M,unsigned int N) { unsigned int Rem; while(N > 0) { Rem = M % N; M = N; N = Rem; } return M; } int main(void) { int a,b; scanf("%d %d",&a,&b); printf("the greatest common factor of %d and %d is ",a,b); printf("%d\n",Gcd(a,b)); return 0; }
最简代码
# 辗转相除法
#include <stdio.h> #include <stdlib.h> int main() { int a = 211, b = 1350; return gcd(b,a); } int gcd(int x,int y) { return y>0?gcd(y,x%y):x; }
最小公倍数
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。
计算方法
分解质因数法
先把这几个数的质因数写出来,最小公倍数等于它们所有的质因数的乘积(如果有几个质因数相同,则比较两数中哪个数有该质因数的个数较多,乘较多的次数)
例如: 45=3*3*5
30=2*3*5
不同的质因数是2。5,3是他们两者都有的质因数,由于45有两个3,30只有一个3,所以计算最小公倍数的时候乘两个3.
最小公倍数等于2*3*3*5=90
公式法
由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即(a,b)×[a,b]=a×b。所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。
例如: 求[18,20],即得[18,20]=18×20÷(18,20)=18×20÷2=180。
求几个自然数的最小公倍数,可以先求出其中两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数,依次求下去,直到最后一个为止。最后所得的那个最小公倍数,就是所求的几个数的最小公倍数。
代码
#include<stdio.h> int gcd(int a,int b); int lcm(int a,int b); int main(void) { int m,n,result_gcd,result_lcm; printf("求两个数的最大公约数及最小公倍数?\n请输入你想计算的两个数:\n"); scanf("%d%d",&m,&n); result_gcd=gcd(m,n); result_lcm=lcm(m,n); printf("最大公约数为:%d\n最小公倍数为:%d\n",result_gcd,result_lcm); return 0; } int gcd(int a,int b) { int temp; if(a<b) { //交换两个数,使大数放在a上 temp=a; a=b; b=temp; } while(b!=0) { //利用辗除法,直到b为0为止 temp=a%b; a=b; b=temp; } return a; } int lcm(int a,int b) { int temp_lcm; temp_lcm=a*b/gcd(a,b);//最小公倍数等于两数之积除以其最大公约数 return temp_lcm; }