求解两个数的最大公约数和最小公倍数
首先最小公倍数的求解是依赖于最大公约数的,因为
最小公约数 = 两个整数的乘积 / 最大公约数
最大公约数的求解
(1)使用辗转相除法:
假设两个整数x和y:
第一步,求得x和y的余,即c = x%y;
第二步,判断c是否为0, 若为0,则说明y是两个数的最大公约数;否则需要将y赋值给x,将c赋值给y,再次执行第一步,直到判断出最大公约数为止。
void GCD_LCD(int x, int y) //求公约数和公倍数
{
int m, n, c;
m = x, n = y;
while(y !=0) //辗转相除求最大公约数
{
c = x%y;
x = y;
y = c;
}
printf("最大公约数 %d\n",x);
printf("最小公倍数 %d\n",m*n/x);
}
函数中while循环也可以改成如下:
while((c = x % y) !=0 )
{
x = y;
y = c;
}
printf("最大公约数 %d\n",y);
printf("最小公倍数 %d\n",m*n/y);
(2)使用相减法:
假设两个整数x和y。
第一步,判断两个数是否相等,只要不相等,则
第二步,判断两个数中较大者,然后将两个数的差保存在较大者中,返回第一步,直到两个数相等,则说明当前的值为最大公约数。
void GCD_LCD(int x, int y) //相减法求解最大公约数
{
int m, n;
m = x; n = y;
while(x != y)
{
if(x>y)
x = x-y; //原先最大的数保存两个数的差
else
y = y-x;
}
printf("最大公约数是:%d\n",x);
printf("最小公倍数是:%d\n",m*n/x);
}
(3)还有一种是穷举法:
用穷举发求最大公约数。
假设两个整数x和y。设置一个数,从1开始,只要x和y都能同时被这个数整除,则记录下来这个数,否则不记录,然后该数递增,直到当前这个数大于x和y的任意一个,则记录下来的数即为最大公约数。也让这个数从x和y中任意一个开始,只要x和y都能同时被这个数整除,则直接输出该数,否则该数递减,再判断。直至x和y同时被当前数整除。
用穷举法求解最小公倍数。
假设两个整除x和y。设置一个数从x和y任意一个开始,只要该数能同时被x和y整除,则该数为最小公倍数,否则该数递增,直到满足条件,即为x和y的最小公倍数。