目录
求最小公倍数算法:
最小公倍数=两整数的乘积÷最大公约数
求最大公约数算法:
(1)辗转相除法(欧几里得法)
有两整数a和b:
① a%b得余数c
② 若c=0,则b即为两数的最大公约数
③ 若c≠0,则a=b,b=c,再回去执行①
例如求27和15的最大公约数过程为:
27÷15 余12
15÷12余3
12÷3余0
因此,3即为最大公约数
#include <stdio.h>
int main() /* 辗转相除法求最大公约数 */
{
int m, n, a, b, t, c;
printf("Input two integer numbers:\n");
scanf("%d%d", &a, &b);
m = a;
n = b;
while (b != 0)
/* 余数不为0,继续相除,直到余数为0 */
{
c = a % b;
a = b;
b = c;
}
printf("The greatest common divisor: %d\n", a);
printf("The least common multiple: %d\n", m * n / a);
}
提供一种简写的方式:
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b, a % b);
}
(2)相减法
有两整数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即为最大公约数
#include <stdio.h>
int main() /* 相减法求最大公约数 */
{
int m, n, a, b, c;
printf("Input two integer numbers:\n");
scanf("%d,%d", &a, &b);
m = a;
n = b;
/* a, b不相等,大数减小数,直到相等为止。*/
while (a != b)
{
if (a > b)
a = a - b;
else
b = b - a;
}
printf("The greatest common divisor:%d\n", a);
printf("The least common multiple:%d\n", m * n / 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--,再回去执行②
#include <stdio.h>
int main() /* 穷举法求最大公约数 */
{
int m, n, a, b, i, t;
printf("Input two integer numbers:\n");
scanf("%d,%d", &a, &b);
m = a;
n = b;
for (i = 1; i <= a; i++)
if (a % i == 0 && b % i == 0)
t = i;
printf("The greatest common divisor:%d\n", t);
printf("The least common multiple:%d\n", m*n / t);
}
/* 改进后的
for (t = a; t > 0; t--)
if (a % t == 0 && b % t == 0)
break;
*/
————————————————
作 者:Angel_Kitty
出 处:https://www.cnblogs.com/ECJTUACM-873284962/
关于作者:阿里云ACE,目前主要研究方向是Web安全漏洞以及反序列化。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。