蓝桥杯模板(一)

质数,筛质数

#如果是某范围内的所有数的质因数 (应先筛去素数,剩下的再分解)
#判断素数
#方法一
from math import sqrt
def is_prime1(n):
    if n == 1:
        return False
    for i in range(2,int(sqrt(n))+1):
        if n %i == 0:
            return False
        return True
print(is_prime1(5))
#方法二(更快捷)
import math  # 导入math库

def is_prime2(n):
    if n > 1:  # 判断n是否大于1
        if n == 2:  # 如果n等于2,返回True,2是素数
            return True
        if n % 2 == 0:  # 如果n是偶数但不等于2,返回False,因为除了2,偶数都不是素数
            return False
        for i in range(3, int(math.sqrt(n)) + 1, 2):  # 遍历3到sqrt(n),步长为2,因为偶数已经排除
            if n % i == 0:  # 如果n能被i整除,说明n不是素数,返回False
                return False
        return True  # 如果循环结束,说明n不是2的倍数也不是奇数的倍数,那么n就是素数,返回True
    return False  # 如果n不大于1,返回False

#埃氏筛除
from math import sqrt  # 导入平方根函数

def get_prime(n):
    ls = [True]*(n+1)  # 创建长度为n+1的布尔列表,用于标记是否为素数
    x = 2  # 初始化起始数字为2
    y = int(sqrt(n))+1  # 设置循环上限为sqrt(n),取整加1
    while x<y:  # 当起始数字小于循环上限时执行循环
        for i in range(x*2,n+1,x):  # 从起始数字的两倍开始,每次增加x,将x的倍数标记为非素数
            ls[i] = False  # 将x的倍数标记为非素数
        x += 1  # 将起始数字增加1,继续下一轮循环
    ls = [i for i in range(2,n+1) if ls[i]== True]  # 生成包含所有标记为素数的数字的列表
    return ls  # 返回素数列表

print(get_prime(20))  # 打印获取20以内的所有素数
#欧拉筛
from math import sqrt  # 导入平方根函数

def get_prime(n):
    ls = [True]*(n+1)  # 创建长度为n+1的布尔列表,用于标记是否为素数
    x = 2  # 初始化起始数字为2
    y = int(sqrt(n))+1  # 设置循环上限为sqrt(n),取整加1
    while x<y:  # 当起始数字小于循环上限时执行循环
        if ls[x] == True:  #->埃氏筛的区别
            for i in range(x*2,n+1,x):
                ls[i] = False
        x += 1  # 将起始数字增加1,继续下一轮循环
    ls = [i for i in range(2,n+1) if ls[i]== True]  # 生成包含所有标记为素数的数字的列表
    return ls  # 返回素数列表

print(get_prime(20))  # 打印获取20以内的所有素数

位运算

#位运算
#左移(>>):左移多少位就相当于将某数除以几个2(二进制下末尾数为1的话有精度丢失)
#右移(<<):右移多少位就相当于将某数乘以几个2
n mod  2 == n&1
n//2 == n>> 1

求n的第k位数字: n >> k & 1 (二进制的位数)
###位运算
返回n的最后一位1:lowbit(n) = n & -n

补充

https://blog.csdn.net/u013671216/article/details/123534854

求质因数

#求一个所有质因数
n = int(input())
ls = []
i = 2
while i <= n:
    x = n%i
    if x == 0:
        ls.append(i)
        n = n/i

    else:
        i += 1
print(ls)

#求所有因数
def get_d(n):
    res = []
    for i in range(1, int(n**0.5) + 1): 
        if n % i == 0:
            res.append(i)
            # 将n除以当前因数的结果也添加到列表中
            if n // i != i:
                res.append(n // i)
    res = sorted(res)
    return res

快速幂

#快速幂
#推荐使用pow 函数
print(pow(2,4))



#快速幂取模

进制转换

#二进制

bin(b)  #正:0bxxxx 负:-0bxxxx

def getBin(n):
    #获得 一个数的二进制字符
    b = str(bin(n))
    if n<0:
        return b[3:]
    else:
        return b[2:]

#十六进制
hex(n)  #正 0x... 负 -0x...

#八进制
oct(x) #正 0o .. 负-0o ..

公约公倍


#最大公约数
def gcd(a,b):
    while b:
        a,b = b,a%b
    return a

#内置库
from math import gcd
gcd(a,b)

#最小公倍数
def lcm(a,b):
    s = a*b
    while b:
        a,b = b,a%b
    return s//a
posted @ 2024-04-07 23:58  taixian  阅读(91)  评论(0)    收藏  举报