1.当输入包括数字且需要根据数字大小进行排序时,一定要加上int,否则就是字符串类型的数字比较了——来自蓝桥杯算法训练:预备爷的悲剧
这张图表示的是某个字符出现在第几页,页数是数字类型,比方说你要创建字典,key为页数,最后按照key升序,那就必须在添加键值对的时候把key转化为int类型。
2.gcd(最大公约数)和lcm(最小公倍数)关系及板子
关系:若a,b>0 那么a*b=gcd(a,b)*lcm(a,b)
gcd板子(太常用了):
def gcd(a,b): while b: a,b=b,a%b return a
那么lcm的板子可以由gcd推得
def lcm(a,b): t=a*b while b: a,b=b,a%b return t//a
#因为到最后a,b的值都不是原来的了,需要一开始用t存a*b
掌握了这两个还需要再掌握一个:求N个数字的gcd(最大公约数)
板子思想:递归(不难,好理解的,前N//2个数字与后N//2个数字的最大公约数就是N个数字的最大公约数)
def gcd(a,b): while b: a,b=b,a%b return a def super_gcd(nums):#把你要处理的N个数字放到列表nums里 #基线条件列表长度为1或2 l=len(nums) if l==1: return nums[0] elif l==2: return gcd(nums[0],nums[1]) else: return gcd(super_gcd(nums[:l//2]),super_gcd(nums[l//2:]))
3.唯一分解定理和质因数分解关系和板子
唯一分解定理:对于n>1,n=(2^a)*(3^b)*(5^c)....*(x^y)
其中y>=0,x为质数,简单来说就是一个数一定可以分解为多个质数的连乘积。
推论:n的约数个数=(a+1)(b+1)...(y+1)
那么我们该如何分解,即如何展开质因数分解 (短除法)
#为了灵活使用,我写一个函数,并把分解出来的质数存到列表里并输出 #怎么加工利用看自己需要 def f(x): i=2 l=[] while i<=x: if x%i==0: l.append(i) x//=i else: i+=1 return l
4.判断质数(最基本的)和埃筛法板子(很多题用到)
判断质数:
#由于一个数n的因子是成对出现的 故只需要枚举到int(n**0.5) def judge(x): for i in range(2,int(x**0.5)+1): if x%i==0: return False return True
埃筛板子:
maxn=10000#这个范围自己依据要查找数据范围内的质数设定
is_prime=[True for i in range(maxn+1)] prime=[] for i in range(2,maxn): if is_prime[i]: prime.append(i) j=i while j<=maxn: is_prime[j]=False j+=i
5.当输入的字符串需要跨行 需要用到""" """ 三引号
6.二分板子(这个不同人有不同的习惯 小郑觉得自己的这个方法不容易出错)
l=0 r=N while l+1!=r mid=(l+r)//2 if #符合条件: r=mid else: l=mid
#划分红蓝区域
7. 重要模块,函数
itertools模块(排列组合常用) import itertools s=[1,2,3]#序列 #l为排列组合的长度:从序列里面取几个出来 l=2 x=itertools.permutations(s,l) y=itertools.combinations(s,l) #如果要查看x,y的内容,转化为列表 阶乘函数: import math math.factorial(n) #求n! 提一下数学知识:不妨令n>=m,A(n,m)=n!/(n-m)! C(n,m)=A(n,m)/m!=n!/[(n-m)!*m!]
手写组合数函数,通常会比直接调factorial来直接表达组合数快很多倍
def C(n,m):#计算组合数 t=1 i,j=n,1 while j<=m: t*=i/j i-=1 j+=1 return int(t)