什么是最大公约数?
a b 的最大公约数是gcd:
即:可以同时被a 和b 整除的数
a % gcd == 0 && b % gcd ==0
a 和b 中可以模的尽的最大值 ==> gcd 是符合上述条件的最大值
什么是最小公倍数?
a b 的最小公倍数是lcm
即: lcm % a ==0 && lcm % b ==0
a 和b 中可以模的尽的最小值 ==> lcm是符合上述条件的最小值
最大公约数算法
方法一: 穷尽法
a b (b 为小值)
1、先找出两个数中的最小值b, 让另一个数字a除以它,如果除的尽,小的数就是最大公约数,(小的数自己出自己肯定除的尽);
2、若除不尽,b-- ,减到可以除尽,最坏的情况是b减为1
24 15
用24 %15
//穷举法!
int gcd(int a, int b) {
if (a == 0)
return b;
else if (b == 0)
return a;
else if (a == b)
return a;
else {
//穷举法:
int gcd_res = a > b ? b : a; //找出a和b中的小值
while (gcd_res < 1) { //1 一定可以被整除,1为最坏的时候
if (gcd_res % a == 0 && gcd_res % b == 0) {
return gcd_res;
break;
} else
gcd_res--;
}
}
}
方法二: 相减法
int gcd(int a, int b) {
if (a == 0)
return b;
else if (b == 0)
return a;
else if (a == b)
return a;
else {
//相减法:
int gcd_res;
while (a != b)
gcd_res = a > b ? (a -= b) : (b -= a); //找出a和b中的小值
return gcd_res;
}
}
方法三:
辗转相除法
代码:
//辗转相除法
int gcd(int a, int b) {
if (a == 0)
return b;
else if (b == 0)
return a;
else if (a == b)
return a;
else {
//辗转相除法:
int mod = a % b;
while (mod) {
a = b;
b = mod;
mod = a % b;
}
return b;
}
}
方法四:辗转相除法的递归实现
//辗转相除法的递归实现
int gcd(int a, int b) {
if (b == 0)
return a;
else {
return gcd(b, a % b);
}
}
错误: 没有给 a ,b 赋值
改为
gcd_res = a > b ? (a -= b) : (b -= a);
最小公倍数算法
方法一:穷举法
a b
找出a 与 b 中的最大值如a为最大值
int x = a;
再看a b 是否可以同时被x 除尽
否则 x++
若a b 中有0,则最大公约数为0
//穷举法:
int lcm(int a, int b) {
if (a * b == 0)
return 0;
else {
int lcm = a > b ? a : b;
while (1) {
if (lcm % a == 0 && lcm % b == 0)
break;
else
lcm++;
}
return lcm;
}
}
整体代码为:
#include <stdio.h>
//穷举法:
int lcm(int a, int b) {
if (a * b == 0)
return 0;
else {
int lcm = a > b ? a : b;
while (1) {
if (lcm % a == 0 && lcm % b == 0)
break;
else
lcm++;
}
return lcm;
}
}
/*
//辗转相除法的递归实现
int gcd(int a, int b) {
if (b == 0)
return a;
else {
return gcd(b, a % b);
}
}
*/
//辗转相除法
int gcd(int a, int b) {
if (a == 0)
return b;
else if (b == 0)
return a;
else if (a == b)
return a;
else {
//辗转相除法:
int mod = a % b;
while (mod) {
a = b;
b = mod;
mod = a % b;
}
return b;
}
}
/*
//相减法
int gcd(int a, int b) {
if (a == 0)
return b;
else if (b == 0)
return a;
else if (a == b)
return a;
else {
//相减法:
int gcd_res;
while (a != b)
gcd_res = a > b ? (a -= b) : (b -= a); //找出a和b中的小值
return gcd_res;
}
}
*/
/*
//穷举法!
int gcd(int a, int b) {
if (a == 0)
return b;
else if (b == 0)
return a;
else if (a == b)
return a;
else {
//穷举法:
int gcd_res = a > b ? b : a; //找出a和b中的小值
while (gcd_res < 1) { //1 一定可以被整除,1为最坏的时候
if (gcd_res % a == 0 && gcd_res % b == 0) {
return gcd_res;
break;
} else
gcd_res--;
}
}
}
*/
int main() {
int a = 0, b = 0;
printf("请输入a,b \n");
scanf("%d%d", &a, &b);
// int gcd_res = gcd(a, b);
// printf("%d 和%d 最大公约数:%d", a, b, gcd_res);
int lcm_res = lcm(a, b);
printf("%d 和%d 最小公倍数:%d", a, b, lcm_res);
return 0;
}