1.最大公约数
a。暴力求法
def gcd(a,b):
for i in range(min(a,b),0,-1):
if a%i==0 and b%i==0:#同时是两者的
return i
b.欧几里得
def gcd(a,b):
if b==0:
return a
return gcd(b,a%b)
递归,数学方法互相除取余。
c.迭代求法
def gcd(a,b):
while b!=0:
a,b=b,a%b
return a
math库中有gcd函数,直接用
from math import gcd
print(gcd(32,123))
print(gcd(3,4,5))
print(gcd(-17,289))#17
2.最小公倍数
最小公倍数=乘积/最大公约数(最快)
暴力判断
def lcm(a,b):
return a*b//gcd(a,b)
3.素数
暴力枚举
def isPrime(a):
if a<2:
return False
for i in range(2,a):
if a%i==0:
returnFalse
return True
简化
def isPrime(a):
if a<2:
return False
for i in range(2,int(sqrt(a))+1):
if a%i==0:
return False
return True
4.素数筛选
对于任意一个大于1的正整数n,那么它的x倍就是合数(x>1)
#求1~n一共多少个质数
def Eratothenes(n):
p=0#计数
is_prime=[True]*(n+1)#标记数组
is_prime[0]=is_prime[1]=False#0,1不是Prime
for i in range(2,n+1):#2~n
if is_prime[i]:#i是质数
prime[p]=i#记录第p个Prime是i
p=p+1
if i+i<=n:
j=2*i
while j<=n:
is_prime[j]=False
j=j+i#每次+i,比如先标2,4,6,8
return p
要得到自然数 n 以内的全部质数,必须把不大于 根号n 的所有质数的倍数剔除,剩下的就是质数。
5.分解质因数
def breakdown(N):
result=[]
for i in range(2,int(sqrt(a))+1):
if N%i==0:#i为N的一个质因子
while N%i==0:
N=N//i
result.append(i)
if N!=1:
result.append(N)
return result