标签:
最大公约数:能够同时被两个数整除的那个最大的数。
最小公倍数:两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数。
最小公倍数=两整数的乘积÷最大公约数 反之同理。
最大公约数算法:
1.GCD算法(欧几里得算法):
1 int gcd(int a,int b) 2 { 3 int r; 4 while(b>0) 5 { 6 r=a%b; 7 a=b; 8 b=r; 9 } 10 return a; 11 }
以上是GCD算法的基础模运算实现,即辗转相除法。
位运算计算:
1 int gcd(int a,int b) 2 { 3 while(b^=a^=b^=a%=b); 4 return a; 5 }
递归方式实现:
1 int gcd(int a,int b) 2 { 3 return (b>0)?gcd(b,a%b):a; 4 }
有两整数a和b:
① 若a>b,则a=a-b
② 若a<b,则b=b-a
③ 若a=b,则a(或b)即为两数的最大公约数
④ 若a≠b,则再回去执行①
例如求27和15的最大公约数过程为:
27-15=12( 15>12 ) 15-12=3( 12>3 )
12-3=9( 9>3 ) 9-3=6( 6>3 )
6-3=3( 3==3 )
因此,3即为最大公约数
1 /* a, b不相等,大数减小数,直到相等为止。*/ 2 while ( a!=b) 3 if (a>b) a=a-b; 4 else b=b-a;
3.穷举法
穷举法,即暴力算法,
有两整数a和b:
① i=1
② 若a,b能同时被i整除,则t=i
③ i++
④ 若 i <= a(或b),则再回去执行②
⑤ 若 i > a(或b),则t即为最大公约数,结束
改进:
① i= a(或b)
② 若a,b能同时被i整除,则i即为最大公约数,
结束
③ i--,再回去执行②
有两整数a和b:
① i=1
② 若a,b能同时被i整除,则t=i
③ i++
④ 若 i <= a(或b),则再回去执行②
⑤ 若 i > a(或b),则t即为最大公约数,结束
改进:
① i= a(或b)
② 若a,b能同时被i整除,则i即为最大公约数,
结束
③ i--,再回去执行②
1 /*穷举法求最大公约数*/ 2 for (t= a; t>0; t-- ) 3 if ( a%t == 0 && b%t ==0 ) 4 break;
1 /*穷举法求最小公倍数*/ 2 for (i= a; ; i++ ) 3 if ( i % a == 0 && i % b ==0 ) 4 break;
标签:
原文地址:http://www.cnblogs.com/Kiven5197/p/5656200.html