最大公约数
数学原理
求最大公约数需要用到辗转相除法(又名欧几里得算法)。例如24和15.
计算过程:
$$24\div15=1...9$$
$$15\div9=1...6$$
$$9\div6=1...3$$
$$6\div3=1...0$$
至此,运算结束。简单的理解就是拿数字a去除以数字b,得到商和余数,然后再拿运算的除数去除以余数。重复这个过程,当余数为0时。这个除数就是我们要求的最大公约数。
我们只需要知道大概怎么用就可以。如果对原理感兴趣可以自行查询。
代码实现
python代码
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
print(gcd(15, 24))
print(gcd(24, 18))每次进行运算的都是两个数,我们甚至不需要定义第三个变量。直接a变成除数b(a=b)。让b变成a和b的余数(b=a%b)。就是我们上面的过程。然后在while循环里执行。当b也就是余数为0的时候循环结束。这个时候的除数a就是我们要求的结果了。
c++代码
#include<iostream>
using namespace std;
int gcd(int a, int b)
{
int temp;
while (b)
{
temp = a;
a = b;
b = temp % b;
}
return a;
}
int main()
{
cout << gcd(24, 15) << endl << gcd(30, 18) << endl;
}c++里面没有元组赋值的写法,所以我们要先用一个变量把a存起来。a=b执行之后。a的值已经改变了,那么b=a%b的值肯定就不正确了。
最小公倍数
我们会求最大公约数,那么最小公倍数就很简单了,只需要记住一个公式就可以:
$$LCM(a,b)=\frac{|a\times b|}{GCD(a,b)}$$
直接把值往公式里面代入即可
c++代码
#include<iostream>
using namespace std;
#include<cmath>
int gcd(int a, int b)
{
int temp;
while (b)
{
temp = a;
a = b;
b = temp % b;
}
return a;
}
int lcm(int a, int b)
{
return abs(a * b) / gcd(a, b);
}
int main()
{
cout << gcd(24, 15) << endl << gcd(30, 18) << endl;
cout << lcm(24, 15) << endl << lcm(30, 18) << endl;
}python代码
def gcd(a, b):
while b != 0:
a, b = b, a % b
return a
def lcm(a, b):
return abs(a * b) // gcd(a, b)
print(gcd(15, 24))
print(gcd(24, 18))
print(lcm(15, 24))
print(lcm(24, 18))