最大公约数
如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。
整除
若整数b除以非零整数a,商为整数,且余数 为零, 我们就说b能被a整除(或说a能整除b),b为被除数,a为除数,即a|b(“|”是整除符号),读作“a整除b”或“b能被a整除”。a叫做b的约数(或因数),b叫做a的倍数。
辗转相除法
又叫【欧几里德算法】
用较大的数除以较小的数,上面较小的除数和得出的余数构成新的一对数,继续做上面的除法,直到出现能够整除的两个数,其中较小的数(即除数)就是最大公约数
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
/* 欧几里德算法:辗转求余 原理: 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
" ,Gcd(a,b)); return 0; } |
最简代码
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 辗转相除法<br>#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。
求几个自然数的最小公倍数,可以先求出其中两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数,依次求下去,直到最后一个为止。最后所得的那个最小公倍数,就是所求的几个数的最小公倍数。
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
#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 ( "求两个数的最大公约数及最小公倍数?
请输入你想计算的两个数:
" ); scanf ( "%d%d" ,&m,&n); result_gcd=gcd(m,n); result_lcm=lcm(m,n); printf ( "最大公约数为:%d
最小公倍数为:%d
" ,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; } |
出处:https://www.cnblogs.com/pam-sh/p/12599576.html