本文整理了Python竞赛中最常用的数学相关内置函数、运算符、位运算技巧,直接复制可用,无冗余知识点,纯实战向!
一、幂运算
Python 中有三种幂运算写法,竞赛场景有严格区分,千万不要混用!
python
# 1. 普通幂运算:** 运算符
print(2 ** 10) # 1024,无优化,大指数会卡顿
# 2. 内置函数 pow(推荐)
# 双参数:和 ** 效果完全一致
print(pow(2, 10)) # 1024
# 三参数:竞赛神技!快速幂取模,底层优化,大指数秒算
# pow(底数, 指数, 模数) = (底数^指数) % 模数,唯一的快速幂实现
print(pow(2, 1000000, 1000))
# 3. math.pow(竞赛禁用)
# 永远返回浮点数,无快速幂,大数丢失精度
import math
print(math.pow(2, 10)) # 1024.0
二、向上/向下取整
python
import math
# math.ceil:向上取整(取大于等于当前数的最小整数)
print(math.ceil(5.4)) # 6
print(math.ceil(-5.4)) # -5
# math.floor:向下取整(取小于等于当前数的最大整数)
print(math.floor(5.4)) # 5
print(math.floor(-5.4)) # -6
三、最大公约数 GCD & 最小公倍数 LCM
核心原理
math.gcd 底层采用 欧几里得算法(辗转相除法) 实现
核心公式:gcd(a, b) = gcd(b, a % b),不断取余迭代,直到余数为0,此时的被除数就是最大公约数。
Python内置函数为C语言优化版,速度极快,竞赛直接调用,无需手写。
1. 两数计算
python
import math
# 最大公约数 gcd
print(math.gcd(20, 25)) # 5
# 最小公倍数 lcm(公式计算)
# lcm(a,b) = a*b // gcd(a,b)
print(20 * 25 // math.gcd(20, 25)) # 100
2. 多数/列表计算
python
from functools import reduce
import math
lst = [12, 18, 24]
# 迭代计算列表所有数的最大公约数
res = reduce(math.gcd, lst)
print(res) # 6
四、除法与取余
区分普通除法、整除、内置取余函数,竞赛计算商和余数必备:
python
# / :普通除法,返回浮点数
print(20/5) # 4.0
# // :整除(向下取整),返回整数
print(20//5) # 4
# divmod:内置函数,一次性返回 (商, 余数)
print(divmod(25, 20)) # (1, 5)
五、常用数学计算
开方、阶乘、对数,竞赛高频工具函数:
python
import math
# 开平方 sqrt
print(math.sqrt(4)) # 2.0
# 阶乘 factorial(仅支持非负整数)
print(math.factorial(3)) # 6
# 对数(竞赛常用:计算数字位数)
print(math.log2(8)) # 3.0 以2为底
print(math.log10(10)) # 1.0 以10为底
六、位运算小技巧
一行代码判断2的幂次,竞赛极简写法:
python
# 判断一个数是2的幂次:x & (x-1) == 0
print(4 & 3 == 0) # True
print(8 & 7 == 0) # True
print(5 & 4 == 0) # False
七、进制转换(二进制高频)
竞赛中二进制转换、统计1的个数、进制互转必备:
python
# 1. 十进制转二进制字符串([2:] 去掉前缀 0b)
x = bin(10)[2:] # '1010'
print(x)
# 2. 统计二进制中1的个数
print(x.count('1')) # 2
# 3. 二进制字符串转回十进制
print(int("1010", 2)) # 10
总结
- 快速幂 :只有三参数
pow(a,b,mod)是快速幂,其余写法无优化 - GCD :底层=辗转相除法,3.8.6仅支持两数,多数必须用
reduce(math.gcd, 列表) - 取整 :
ceil向上、floor向下,无四舍五入 - 进制 :
bin(x)[2:]转纯二进制,int(字符串, 进制)转回十进制 - 禁用 :
math.pow浮点数精度差,竞赛不使用