由于这些都非常简单易懂,所以就懒得写注释了
1.求最大公约数和最小公倍数
1.1求最大公约数
# 求最大公约数 GCD
def gcd(a,b):
if b==0:
return a
return gcd(b, a%b)
print("%d和%d的最大公约数是%d" % (12,3,gcd(12,3)))
1.2求最小公倍数
# 先写出最大公约数函数 GCD
def gcd(a,b):
if b==0:
return a
return gcd(b, a%b)
print("%d和%d的最大公约数是%d" % (12,3,gcd(12,3)))
# 求最小公倍数 LCM
def lcm(a,b):
return a//gcd(a,b)*b
print("%d和%d的最小公倍数是%d" % (7,6,lcm(7,6)))
2.判断素数
2.1判断素数(慢)
from math import *
def is_su(x):
if x<=1:
return False
m=int(sqrt(x)+1)
for i in range(2,m):
if x % i == 0:
return False
return True
2.2筛选素数
# 筛选素数
# 输出1 ~ N-1的所有素数
# 一个个找速度太慢!!!
from math import *
N=int(1e6)
prime=[0]*N
vis=[0]*N
def check(n):
for i in range(2,int(sqrt(n)+1)):
if not vis[i]:
for j in range(i*i,n+1,i):
vis[j]=1
k=0
for i in range(2,n+1):
if not vis[i]:
prime[k]=i
k+=1
return k
n=int(input())
w=check(n-1)
for i in range(w):
print(prime[i],end=',')
2.3区间素数
# 区间素数
from math import *
N=int(1e8)
prime=[0]*N
vis=[True]*N
seg=[True]*N
def check(a,b):
for i in range(2,int(sqrt(b))+1):
if vis[i]:
for j in range(i*i,int(sqrt(b)),i):
vis[j]=False
for j in range(max(2,(a+i-1)//i),b+1,i):
seg[j-a]=False
k=0
for i in range(b-a+1):
if seg[i]:
prime[k]=i+a
k+=1
print(k)
a,b=map(int,input().split())
check(a,b)
3组合数
给定案例:给定 n 组询问,每组询问给定两个整数 a,b ,请你输出 Cbamod(109+7) 的值。输入格式
第一行包含整数 n 。接下来 n 行,每行包含一组 a 和 b 。
输出格式
共 n 行,每行输出一个询问的解。
数据范围
1≤n≤10000 ,
1≤b≤a≤2000
输入样例:
3
3 1
5 3
2 2
输出样例:
3
10
1
n=int(input())
N=2010
mod=int(1e9)+7
C=[[0]*N for i in range(N)]
for i in range(N):
for j in range(i+1):
if not j:
C[i][j]=1
else:
C[i][j]=(C[i-1][j-1]+C[i-1][j]) % mod
for i in range(n):
a,b=map(int,input().split())
print(C[a][b])
4图线模板
4.1平面分割
平面上有 N 条直线,其中第 i 条直线是y=Ai×x+Bi。
请计算这些直线将平面分成了几个部分?
n=int(input())
line=[tuple(map(int,input().split())) for i in range(n)]
# 去穷,排除重合的直线
se=set(line)
line=list(se)
if line:
ans=2
for i in range(1,len(line)): # 1表示从第二条直线开始
a1,b1=line[i]
pos=set()
for j in range(i): # 记录第i条直线与之前的所有直线的交点
a2,b2=line[j]
if a1==a2:
continue
x=(b2-b1)/(a1-a2)
y=a1*x+b1
pos.add((x,y)) # 记录交点坐标
print(len(pos))
ans+=len(pos)+1 # 多少个交点,就有多少个+1的平面
print(ans)
4.2点和直线的关系
def cross(x1,y1,x2,y2): #叉积
return x1*y2-y1*x2
n=int(input())
for i in range(n):
ax,ay=map(float,input().split())
bx,by=map(float,input().split())
cx,cy=map(float,input().split())
x1=ax-bx
y1=ay-by
x2=ax-cx
y2=ay-cy
s=cross(x1,y1,x2,y2) # 用面积表示,+表示左,-表示右,0表示IN
if s>0:print("L")
if s==0:print("IN")
if s<0:print("R")
4.3点和线段的关系
def cross(x1,y1,x2,y2): #叉积
return x1*y2-y1*x2
def dot(x1,y1,x2,y2): #点积
return x1*x2+y1*y2
n=int(input())
for i in range(n):
ax,ay=map(float,input().split())
bx,by=map(float,input().split())
cx,cy=map(float,input().split())
x1=ax-cx
y1=ay-cy
x2=bx-cx
y2=by-cy
if cross(x1,y1,x2,y2)==0 and dot(x1,y1,x2,y2)<=0:
print("Yes")
else:
print("No")
4.4点到直线距离
from math import *
def cross(x1,y1,x2,y2):
return x1*y2-x2*y1
n=int(input())
for i in range(n):
ax,ay=map(float,input().split())
bx,by=map(float,input().split())
cx,cy=map(float,input().split())
x1=ax-bx
y1=ay-by
x2=ax-cx
y2=ay-cy
s=abs(cross(x1,y1,x2,y2))
w=sqrt(x1*x1+y1*y1)
print("{:.2f}".format(s/w))