C语言求最小公倍数和最大公约数三种算法(经典)----ACM
【导师实战追-女孩资-源】【Q/Q:⒈016.x.⒐52б】 求最小公倍数算法:
最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c
② 若c=0,则b即为两数的最大公约数 ③ 若c≠0,则a=b,b=c,再回去执行① 例如求27和15的最大公约数过程为:
27÷15 余1215÷12余312÷3余0因此,3即为最大公约数 1 #includestdio.h
2 int main() -* 辗转相除法求最大公约数 *- 4 int m, n, a, b, t, c;
5 printf(\ 6 scanf(\ 7 m=a; n=b;
8 while(b!=0) -* 余数不为0,继续相除,直到余数为0 *- 9 { c=a%b; a=b; b=c;}
10 printf(\
11 printf(\提供一种简写的方式: 1 int gcd(int a,int b) 3 return b==0?a:gcd(b,a%b); ⑵ 相减法 有两整数a和b: ① 若ab,则a=a-b ② 若ab,则b=b-a
③ 若a=b,则a(或b)即为两数的最大公约数 ④ 若a≠b,则再回去执行①
例如求27和15的最大公约数过程为: 27-15=12( 1512 ) 15-12=3( 123 ) 12-3=9( 93 ) 9-3=6( 63 ) 6-3=3( 3==3 ) 因此,3即为最大公约数 1 #includestdio.h
2 int main ( ) -* 相减法求最大公约数 *- 4 int m, n, a, b, c;
5 printf(\ 6 scanf (\
7 -* a, b不相等,大数减小数,直到相等为止。*- 8 while ( a!=b)
9 if (ab) a=a-b; 10 else b=b-a;
11 printf(\12 printf(\⑶穷举法 有两整数a和b:
② 若a,b能同时被i整除,则t=i ④ 若 i = a(或b),则再回去执行②
⑤ 若 i a(或b),则t即为最大公约数,结束 ① i= a(或b)
② 若a,b能同时被i整除,则i即为最大公约数, ③ i--,再回去执行② 有两整数a和b:
② 若a,b能同时被i整除,则t=i ④ 若 i = a(或b),则再回去执行②
⑤ 若 i a(或b),则t即为最大公约数,结束 ① i= a(或b)
② 若a,b能同时被i整除,则i即为最大公约数, ③ i--,再回去执行② 1 #includestdio.h
2 int main () -* 穷举法求最大公约数 *- 4 int m, n, a, b, i, t;
5 printf(\ 6 scanf (\ 7 for (i=1; i= a; i++) 8 if ( a%i == 0 b%i ==0 ) t=i;
9 printf(\10 printf(\12 -* 改进后的
13 for (t= a; t0; t-- )
14 if ( a%t == 0 b%t ==0 ) break; 1 --穷举法求最小公倍数 2 for (i= a; ; i++ )
3 if ( i % a == 0 i % b ==0 ) break;
4 printf(\ 6 --多个数的最大公约数和最小公倍数 7 for (i= a; i0; i-- )
8 if (a%i==0b%i==0c%i==0) break;
9 printf(\10 for (i= a; ; i++ )
11 if (i%a==0i%b==0i% c==0) break;
12 printf(\?printf(\
iLen = max(iLen, divide(a,iTimeArr,iPrimeArr,iPrimeLen));
2 int main ( ) -* 相减法求最大公约数 -
11 printf(\printf(\console.log(smallestCommons([23, 18])); this.minMulti = this._getMinMulti()
最大公约数和最小公倍数算法是数学界经典的算法之一。其中主要是西方的欧几米德算法(辗转相除法)和东方的《九章算术》更相减损法。在计算机界也有着广泛用法。本文主要是用java实现递归和循环方式来实现两种算法,至于原理性的文章请参照百度百科即可。