蓝桥杯(六)——数论

目录

一、欧几里得算法(辗转相除法)gcd

1. 讲解

2. 代码

二、LCM 最小公倍数

1. 讲解

2. 代码

三、线性筛选(欧拉筛法)

1. 讲解

2. 代码 

三、算术基本定理(分解质因数)

        1.代码 


一、欧几里得算法(辗转相除法)gcd

1. 讲解

作用:求最大公约数

内容:设gcd(a,b)是a、b的最大公约数,若a、b都不为零,则gcd(a,b)= gcd( b,a%b);若b=0, 则gcd(a,b)=a。

2. 代码

def gcd(a,b):
    if b==0:#b=0, 则gcd(a,b)=a
        return a
    else: #b!=0, 则gcd(a,b)=gcd(b,a%b)
        return gcd(b,a%b)

二、LCM 最小公倍数

1. 讲解

定理:a、b 两个数的最小公倍数乘以它们的最大公约数等于 a 和 b 本身的乘积。

最小公倍数=a*b/最大公约数

2. 代码

def gcd(a,b):
    if b==0:#b=0, 则gcd(a,b)=a
        return a
    else: #b!=0, 则gcd(a,b)=gcd(b,a%b)
        return gcd(b,a%b)

def lcm(a,b):
    return a*b//gcd(a,b)

三、线性筛选(欧拉筛法)

1. 讲解

作用:筛选n以内的所有质数

内容:

从小到大枚举每个数

1. 如果当前的数没有被划掉,必定是质数,记录改质数

2. 枚举已记录的质数(若合数已经越界则中断)

  (1)合数未越界,则划掉合数

  (2)条件i%p==0,保证合数只被最小质因子划掉

           若i是质数,则最多只枚举到自生就中断

           若i是合数,则最多枚举到自身最小质数中断

2. 代码 

n=int(input())
vis=[0 for i in range(n+1)] #划掉合数
prim=[]#记录质数

def get_prim(n):
    for i in range(2,n+1): #枚举2-n寻找质数
        if vis[i]==0:
            prim.append(i)
        for j in range(len(prim)):
            if i*prim[j]>n:
                break
            vis[i*prim[j]]=1 #划掉合数
            if i % prim[j]==0: #只被最小质因子划掉
                break
get_prim(n)
print(prim)

四、算术基本定理(分解质因数)

原因:一个合数的因子必然有一个不大于它的平方根的因子

1.代码 

import math
def get_primes(n):
  primes,count=[],[]#记录质因数和其个数
  for i in range(2,int(math.sqrt(n))+1): #一个合数的因子必然有一个不大于它的平方根的因子。
    if n%i==0:
      primes.append(i)
      t=0
      while n%i==0:
        t+=1
        n=n//i
      count.append(t)
  if n>1: #如果计算完后,n大于1说明n本身是一个质数,否则n==1
    primes.append(n)
    count.append(1)
  return primes,count

五、python中的一些数学函数

1. 开方

import math
y=math.sqrt(x)

2. 阶乘

求x的阶乘

import math
y=math.factorial(x)

3. 绝对值

print(abs(-3))

4. 指数

x=2**3
#或者
x=pow(2,3)

5. 数据转换 

# ord() 函数 :获取单个字符的ASCII数值
x=ord('a')
print(x)
97
# hex() 函数 :十进制转十六进制
x=hex(100)
print(x)
0x64
# oct() 函数 :十进制转八进制
x=oct(100)
print(x)
0o144
# bin() 函数 :十进制转二进制
x=bin(100)
print(x)
0b1100100
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值