【专题】简单数论

【专题】简单数论

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
----------------------------------