整除
整除:一个数能被另一个数整除,即余数为0。a整除b,就是b%a=0
,记为a|b
。
b被a长出说明b%a=0
。
python中的除法/
默认是小数除法。
python中的整除符号为//
。
向下取整:a//b
向上取整:(a+b)//b
,a//b+1
整除的性质:
- a|b,b|c=>a|c
- c|a,c|b=>c|(ma+nb)
同余
同余:余数相同
a%m=b%m
(a-b)%m=0=>m|(a-b)
a=km+b
同余的性质
- 自反性:自己和自己同余
- 对称性:a和b同余<=>b和a同余
- 传递性:a和b同余,b和c同余=>a和c同余
- 线性运算:如果a和b同余,c和d同余=>a±b和c±d同余
求解问题时如果需要对答案求余,只需要每次运算均保持求余(只要保证运算中不出现除法即可)。
即最终答案对mod求余和每次运算均求余答案一致。
最大公因数GCD
a和b的最大公因数就是同时整除a和b的最大整数,记为gcd(a,b)
如何求gcd?
假设a>b,a=bk+c。
设p=gcd(a,b),q=gcd(b,c)=>p|a,p|b,q|b,q|c
c=a-bk=>p|c=>p<=q
a=bk+c=>q|a=>q<=p
综上p=q
即gcd(a,b)=gcd(b,a%b)
def gcd(a,b):
if b==0:
return a
return gcd(b,a%b)
print(gcd(15,10))
还可以直接从math模块里面导入,该函数还这次hi多个数字同时求最大公因数。
from math import *
print(gcd(12,18,24))
最小公倍数
假如求12和18的最小公倍数。
12和18的最大公因数是6.
最小公倍数应该是6*(12/6)(18/6)=36
总之,gcd(a,b)lcm(a,b)=ab
lcm(a,b)=ab/gcd(a,b)
def lcm(a,b):
return(a*b/gcd(a,b))
print(lcm(15,10))