质数,筛质数
#如果是某范围内的所有数的质因数 (应先筛去素数,剩下的再分解)
#判断素数
#方法一
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