求最大公约数
约数:如果整数a能被整数b整除,那么a叫做b的倍数,b叫做a的约数。
给定两个整数a,b,两个数的所有公共约数中的最大值即为最大公约数 (Greatest Common Divisor,GCD)。
它的基本思想是:对于整数a和b,利用辗转相除法,反复将a和b相除并取余数 ,直到余数为0为止。此时,非零的余数即为a和b的最大公约数。
该算法的原理可以用公式gcd(a,b) = gcd(b,a mod b)来表示,其中gcd表示最大公约数,mod表示取余操作。算法从a和b开始,反复进行取余操作,直到余数为0,此时的除数即为最大公约数。
代码实现
递归实现:
python
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
print(gcd(12,16))
非递归实现:
python
def gcd(a, b):
while b != 0:
r = a % b
a = b
b = r
return a
print(gcd(12,16))
分数计算
通过欧几里得算法,可以实现分数的约分和通分,从而实现分数的运算。
一个分数,分子分母上下同时约分的实现
python
def __init__(self, a, b):
self.a = a
self.b = b
x = self.gcd(a, b)
self.a /= x
self.b /= x
求分母的最小公倍数方法:
python
def zgs(self, a, b):
x = self.gcd(a, b)
return a * b / x
实现分数加法
python
class Fraction:
def __init__(self, a, b): # 分子分母同时约分
self.a = a
self.b = b
x = self.gcd(a, b)
self.a /= x
self.b /= x
def gcd(self, a, b): # 求最大公约数
while b != 0:
r = a % b
a = b
b = r
return a
def zgs(self,a, b): # 求最小公倍数
x = self.gcd(a,b)
return a*b/x
def __add__(self, other): # 加法实现
a = self.a
b = self.b
c = other.a
d = other.b
fenmu = self.zgs(b, d)
fenzi = a * fenmu / b + c * fenmu / d
return Fraction(fenzi, fenmu)
def __str__(self): # 打印分数
return "%d/%d" % (self.a, self.b)
# 测试案例
a = Fraction(1,3)
b = Fraction(1,2)
print(a+b)