【专题】简单数论
1、常见的数学函数
=> python本身自带的数学函数
1:绝对值【abs】
print(abs(-132))
--------------------
132
--------------------
2:幂计算【**】
# 2的3次方
a = 2 ** 3
print(a)
-------------
8
-------------
3:四舍五入【round】
result = 3.1415926
print(round(result,2))
-------------------------
3.14
-------------------------
=> math库中的数学函数
4:开平方【math.sqrt(x)】
import math
a = 16
result = math.sqrt(a)
print(result)
-----------------------
4.0
-----------------------
5:幂计算【math.pow(a,b)】
import math
result1 = math.pow(16,1/2) # 16的1/2次方
result2 = math.pow(16,2) # 16的2次方
print(result1,result2)
------------------------------
4.0 256.0
------------------------------
补充:pow(a,b,c)
含义:返回 (x**y) % z
结果
result=pow(2,3,7)
print(result)
---------------------
1 # 2**3 % 7
---------------------
6:向上取整【math.ceil(x)】
import math
n=3.2
shang=math.ceil(n)
print(shang)
------------------------
输出:4
------------------------
6:向下取整【math.floor(x)】
import math
n=3.2
shang=math.floor(n)
print(shang)
2、常见数学题
1、素数(质数)题型
口袋的负载量就是口袋里的所有数字之和。
但是口袋的承重量有限,装的质数的和不能超过 L。给出 L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数的个数,数字之间用换行隔开。
import math
# 判断是否为质数,是则返回1,不是则返回0
def f(n):
# 质数从2开始
if n<=1:
return 0
sqrt = int(math.sqrt(n))
for i in range(2,sqrt+1):
if n%i==0:
return 0
return 1
# 输入
n = int(input())
sum = 0
temp = []
i=1
count = 0
while 1:
if f(i) == 1:
sum += i
if sum <= n:
temp.append(i)
count += 1
else:
break
i += 1
# 输出
for i in range(len(temp)):
print(temp[i])
print(count)
--------------------------------------------
输入:100
2
3
5
7
11
13
17
19
23
9
--------------------------------------------
2、分解质因数
给定一个区间 [a,b],请你求出区间 [a,b] 中所有整数的质因数分解。
# 质因数
def prime_factor(n):
factor=[]
for i in range(2,n+1):
while n%i==0:
n=n//i
factor.append(i)
if n==1:
break
return factor
a,b=list(map(int,input().split()))
for i in range(a,b+1):
k=prime_factor(i)
print("%d=" % i,end='')
for j in range(len(k)):
if j<len(k)-1:
print("%d" % k[j],end='*')
else:
print("%d" % k[j])
--------------------------------------
输入:3 10
输出:
3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
--------------------------------------
3、最大公约数
def gcd(a,b):
if b ==0:
return a
else:
return gcd(b,a%b)
a,b=list(map(int,input().split()))
a=int(a)
b=int(b)
print(gcd(a,b))
----------------------
输入:12 16
输出:4
----------------------
4、最小公倍数
# 最大公约数
def gcd(a,b):
if b==0:
return a
else:
return gcd(b,a%b)
# 利用最大公约数计算最小公倍数
def lcm(a,b):
return a // gcd(a,b) * b
a,b=list(map(int,input().split()))
a=int(a)
b=int(b)
print(lcm(a,b))
----------------------
输入:4 6
输出:12
----------------------
5、卡特兰数
适合解决以下问题:
- 出栈次序问题:一个栈的进栈序列为1、2、3、…、n,有多少个不同的出栈序列?
- 多边形划分问题:将一个凸多边形区域分成三角形区域的方法数。
- 二叉树形状问题:N个节点的二叉树有多少种形状?
- 括号序列问题:给定n个括号,有多少种有效的括号序列?
公式:(2*n)! / (n+1)! * (n)!
def f(n):
if n ==1:
return 1
else:
return n*f(n-1)
n = int(input())
temp1 = f(n+1)
temp2 = f(n)
print(int(f(2*n)/(temp1*temp2)))
6、切波那契数
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你n ,请计算 F(n) 。
def f(n):
if n==0:
return 0
elif n==1:
return 1
else:
return f(n-1)+f(n-2)
a=f(4)
print(a)
----------------------------------
输入:4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3
----------------------------------