如果a>b,则a和b与a-b和b的最大公约数相同,即Gcd (a, b) = Gcd (a-b, b) 性质2 如果b>a,则a和b与a和b-a的最大公约数相同,即Gcd (a, b) = Gcd (a, b-a) 性质3 如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd (a, b) = a = b
步骤:
1.判断a是否大于b,如果成立则将a-b的值赋给a,求a-b,反之如果b大于a,则将b-a的值赋给b,往复循环,直到a的值等于b时,两者中的任意一值就是它们的最大公约数。
#include
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
while ((a - b) != 0)
{
if (a > b)
{
a = a - b;
}
else
{
b = b - a;
}
}
printf("%d %d\n", a, b);
return 0;
}
根据最大公约数指的是两个整数公共的最大因数的概念,我们可以从两者中较小的值开始寻找,找到能够同时整除俩数的值就是最大共约数。
步骤:
1.先找出两者中最小值,从它开始递减循环,直到找到能够同时整除两个数的值(不能为0)就是它的最大公约数。
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)<(y)?(x):(y))
#include
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int n = MAX(a, b);
int m = MIN(a, b);
for (int i = m; i >= 1; i--)
{
if (n % i == 0 && m % i == 0)
{
printf("%d\n", i);
break;
}
}
return 0;
}
辗转相除法之所以有效是因为其基于一个核心原理,即:
两个数的最大公约数等于其中较小的数字和二者之间余数的最大公约数
同样找出两数之间的最大值(n)与最小值(m),将n%m的值赋给一个中间变量temp,之后将m的值赋给n,temp的值赋给m,往复循环,直到temp为0,剩下的m就是最大公约数.
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)<(y)?(x):(y))
#include
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int n = MAX(a, b);
int m = MIN(a, b);
int temp = 0;
while (temp = n % m)
{
n = m;
m = temp;
}
printf("%d\n", m);
return 0;
}
与最大公约数的暴力法一样,两个或多个 整数 公有的 倍数 叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。
步骤
找出两数的最大值,从它开始递增,直到找到能够同时除余它们为0的数就是最小公倍数。
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)<(y)?(x):(y))
#include
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int i = MAX(a, b);
while (1)
{
if (i % a == 0 && i % b == 0)
{
break;
}
i++;
}
printf("%d\n", i);
return 0;
}
由最小公倍数的性质,n(较大值)乘以一个整数,除于m(较小值)==0时,n*i(整数)就是它们的最小公倍数。
步骤
找出两数间的最大与最小值,i从1开始,如果与n相乘%m==0则停止,n*i就是它们的最小公倍数。
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)<(y)?(x):(y))
#include
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int n = MAX(a, b);
int m = MIN(a, b);
int i = 1;
while (1)
{
if (n * i % m == 0)
{
break;
}
i++;
}
printf("%d\n", n*i);
return 0;
}
性质:两个数的乘积等于这两个数的最大公约数与最小公倍数的乘积。
步骤
利用上面的任意方法找到最大公约数,用两个数的乘积除以它就得到最小公倍数。
#define MAX(x,y) ((x)>(y)?(x):(y))//宏定义
#define MIN(x,y) ((x)<(y)?(x):(y))
#include
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int n = MAX(a, b);
int m = MIN(a, b);
int z = 0;
while (z = n % m) //辗转相除法
{
n = m;
m = z;
}
printf("%d", (a * b) / m);
return 0;
}