目录
一、欧几里得算法(辗转相除法)gcd
1. 讲解
作用:求最大公约数
内容:设gcd(a,b)是a、b的最大公约数,若a、b都不为零,则gcd(a,b)= gcd( b,a%b);若b=0, 则gcd(a,b)=a。
2. 代码
def gcd(a,b):
if b==0:#b=0, 则gcd(a,b)=a
return a
else: #b!=0, 则gcd(a,b)=gcd(b,a%b)
return gcd(b,a%b)
二、LCM 最小公倍数
1. 讲解
定理:a、b 两个数的最小公倍数乘以它们的最大公约数等于 a 和 b 本身的乘积。
最小公倍数=a*b/最大公约数
2. 代码
def gcd(a,b):
if b==0:#b=0, 则gcd(a,b)=a
return a
else: #b!=0, 则gcd(a,b)=gcd(b,a%b)
return gcd(b,a%b)
def lcm(a,b):
return a*b//gcd(a,b)
三、线性筛选(欧拉筛法)
1. 讲解
作用:筛选n以内的所有质数
内容:
从小到大枚举每个数
1. 如果当前的数没有被划掉,必定是质数,记录改质数
2. 枚举已记录的质数(若合数已经越界则中断)
(1)合数未越界,则划掉合数
(2)条件i%p==0,保证合数只被最小质因子划掉
若i是质数,则最多只枚举到自生就中断
若i是合数,则最多枚举到自身最小质数中断
2. 代码
n=int(input())
vis=[0 for i in range(n+1)] #划掉合数
prim=[]#记录质数
def get_prim(n):
for i in range(2,n+1): #枚举2-n寻找质数
if vis[i]==0:
prim.append(i)
for j in range(len(prim)):
if i*prim[j]>n:
break
vis[i*prim[j]]=1 #划掉合数
if i % prim[j]==0: #只被最小质因子划掉
break
get_prim(n)
print(prim)
四、算术基本定理(分解质因数)
原因:一个合数的因子必然有一个不大于它的平方根的因子。
1.代码
import math
def get_primes(n):
primes,count=[],[]#记录质因数和其个数
for i in range(2,int(math.sqrt(n))+1): #一个合数的因子必然有一个不大于它的平方根的因子。
if n%i==0:
primes.append(i)
t=0
while n%i==0:
t+=1
n=n//i
count.append(t)
if n>1: #如果计算完后,n大于1说明n本身是一个质数,否则n==1
primes.append(n)
count.append(1)
return primes,count
五、python中的一些数学函数
1. 开方
import math
y=math.sqrt(x)
2. 阶乘
求x的阶乘
import math
y=math.factorial(x)
3. 绝对值
print(abs(-3))
4. 指数
x=2**3
#或者
x=pow(2,3)
5. 数据转换
# ord() 函数 :获取单个字符的ASCII数值
x=ord('a')
print(x)
97
# hex() 函数 :十进制转十六进制
x=hex(100)
print(x)
0x64
# oct() 函数 :十进制转八进制
x=oct(100)
print(x)
0o144
# bin() 函数 :十进制转二进制
x=bin(100)
print(x)
0b1100100