每日python练习6--求两个数的最大公约数和最小公倍数

'''
方法1:辗转相除法(欧几里德算法)原理:

假设有两个数x和y,存在一个最大公约数z=(x,y),即x和y都有公因数z,
因为: 
	x,y都能被z整除;
得:
	x和y的线性组合mx±ny也一定能被z整除。(m和n可取任意整数)

假设: 
	x/y=n余c,
得:
	x=ny+c
	x-ny=c
因为:
	mx±ny能被z整除
得:
	x-ny(作为mx±ny的一个特例)就能被z整除,即x除y的余数c也能被z整除。

因为:
	c,y都能被z整除
得:
	my+nc也能被z整除
	。。。
重复上述步骤,直到余数c=0,最大公约数z=n. 

'''
def divisor(a, b):
    """该函数返回两个数的最大公约数"""
    
    if b == 0:
        return a
    else:
        return divisor(b, a%b)

a, b = input("Enter two natural numbers:").split()
print(divisor(int(a), int(b)))

'''
方法2:更相减损法

假设有两个数x和y,存在一个最大公约数z=(x,y),即x和y都有公因数z,
因为: 
	x,y都能被z整除;
得:
	当x不等于y时,
	x-y也一定能被z整除
假设: 
	x-y=c,
得:
	c,y都能被z整除(y<x)

重复上述步骤:
当:
	c-y=0时,c为x,y的最大公约数
'''

def divisor(x, y):
    """该函数返回两个数的最大公约数"""

    if x > y:
        c, y = x - y, y
    else:
        c, y = y - x, x

    if c == 0:
        return y

    else:
        return divisor(c, y)


a, b = input("Enter two natural numbers:").split()
print(divisor(int(a), int(b)))



'''
方法3:穷举法
从1开始循环,一直循环到两个数中小的那个数。
'''

def divisor(x, y):
    """该函数返回两个数的最大公约数"""

    # 获取最小值
    if x > y:
        smaller = y
    else:
        smaller = x

    for i in reversed(range(1, smaller + 1)):
        if ((x % i == 0) and (y % i == 0)):
            return i

a, b = input("Enter two natural numbers:").split()
print(divisor(int(a), int(b)))

'''
4. 最小公倍数

最小公倍数 = 用两个数的乘积除以最大公约数

例如x和y的最小公倍数为x*y/gcd(x,y)。(gcd(x,y)表示为两个数的最大公约数)
'''
上一篇:redis笔记&&redis入门指南读书笔记


下一篇:SQL Server 2008性能故障排查(三)——I/O