最大公约数:
思路一:穷举法
步骤:
1.有a,b两数(a>b),最大公约数不可能比b大,将较小数b的值赋给m
2.若m能同时整除a,b时,此时的m就是最大公约数,
3.否则m减1,继续重复上述操作
代码:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
//将a,b两数较小值赋给m
int m = (a > b ? b : a);
while (1)
{
if (a % m == 0 && b % m == 0)
{
break;
}
m--;
}
printf("%d\n", m);
return 0;
}
思路二:辗转相除法
步骤:
1.m为a除以b的余数,若 m=0,b为最大公约数
2.否则,将b赋值给a,m赋值给b,重复上述操作
代码:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int m = 0;
//a除以b的余数不等于0,进入循环
while (m = a % b)
{
a = b;
b = m;
}
printf("%d", b);
return 0;
}
思路三:更相减损法
步骤:
1.用a,b两数较大数减去较小数,把所得的差与较小数比较,并以大者减小者
2.继续上述操作,直到所得的减数和差相等为止
代码:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
//a,b不相等时,说明当前较小值与差值不相等
while (a != b)
{
//无论执行哪条分支语句,都会将大数-小数的差值赋给减之前较大数的变量
if (a > b)
{
a -= b;
}
else
{
b -= a;
}
}
printf("%d\n", b);
return 0;
}
最小公倍数:
最小公倍数同样可以用穷举法,只需要在求最大公约数的代码中略作改动,直接给出代码如下:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
//将a,b两数较大值赋给m
int m = (a > b ? a : b);
while (1)
{
if (m % a == 0 && m % b == 0)
{
break;
}
m++;
}
printf("%d\n", m);
return 0;
}
除此之外,还可以用公式(如有两个数a,b,它们的最大公约数为m)
最小公倍数 = (a × b) / m
如下为辗转相除法求最小公倍数:
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
//存一份原始值的副本
int oa = a;
int ob = b;
int m = 0;
//a除以b的余数不等于0,进入循环
while (m = a % b)
{
a = b;
b = m;
}
printf("%d", (oa * ob) / b);
return 0;
}
运行结果如下: