python常用算法

这篇博客涵盖了多种Python编程技巧,包括计算素数、使用列表推导式生成素数、实现水仙花数、解决鸡兔同笼问题、计算组合数C(n,i)、输出菱形图案、进制转换、字符串操作、最大公约数计算、列表元素移位以及绘制七段数码管显示日期。通过这些实例,展示了Python在算法和数据结构上的应用。
摘要由CSDN通过智能技术生成

求素数

【题目】下面的代码用来计算小于100的最大素数,注意break语句和else子句的用法。

for n in range(100,1,-1):

    for i in range(2,n):

        if n%i == 0:
            break

    else:

        print(n)

        break    

 【题目】使用列表推导式生成100以内的所有素数

一个数若可以进行因数分解,那么分解时得到的两个数一定是一个小于等于sqrt(n),一个大于等于sqrt(n),据此,上述代码中并不需要遍历到n-1,遍历到sqrt(n)即可。

>>> [p for p in range(2, 100) if 0 not in [p%d for d in range(2, int(p**0.5)+1)]]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

水仙花数

for i in range(100, 1000):
    #这里是序列解包的用法
    bai, shi, ge = map(int, str(i))
    if ge**3 + shi**3 + bai**3 == i:
        print(i)

鸡兔同笼

for ji in range(0, 31):
    if 2*ji + (30-ji)*4 == 90:
        print('ji:', ji, ' tu:', 30-ji)
#另一种计算方法
>>> def demo(tui, jitu):
       tu = (tui - jitu*2)/2
       if int(tu)==tu:
              return (int(tu), int(jitu-tu))
       else:
              return 'Data Error'

排列组合

【题目】编写程序,输出由1、2、3、4这四个数字组成的每位数都不相同的所有三位数。

digits = (1, 2, 3, 4)
for i in digits:
    for j in digits:
        for k in digits:
            if i!=j and j!=k and i!=k:
                print(i*100+j*10+k)

【优化后】

digits = (1, 2, 3, 4)
for i in digits:
    for j in digits:
        if j==i:
            continue
        for k in digits:
            if k==i or k==j:
                continue
            print(i*100+j*10+k)

 【题目】编写程序,计算组合数C(n,i),即从n个元素中任选i个,有多少种选法。

根据组合数定义,需要计算3个数的阶乘,在很多编程语言中都很难直接使用整型变量表示大数的阶乘结果,虽然Python并不存在这个问题,但是计算大数的阶乘仍需要相当多的时间。本例提供另一种计算方法:以Cni(8,3)为例,按定义式展开为Cni(8,3)=8!/3!/(8-3)!=(8*7*6*5*4*3*2*1) /(3*2*1)/ (5*4*3*2*1),对于(5,8]区间的数,分子上出现一次而分母上没出现;(3,5]区间的数在分子、分母上各出现一次;[1,3]区间的数分子上出现一次而分母上出现两次。

def Cni1(n,i):
    if not (isinstance(n,int) and isinstance(i,int) and n>=i):
        print('n and i must be integers and n must be larger than or equal to i.')
        return
    result = 1
    Min, Max = sorted((i,n-i))
    for i in range(n,0,-1):
        if i>Max:
            result *= i
        elif i<=Min:
            result /= i
    return result
#也可以使用math库中的阶乘函数直接按组合数定义实现。

>>> def Cni2(n, i):
	import math
	return int(math.factorial(n)/math.factorial(i)/math.factorial(n-i))
>>> Cni2(6,2)
15
#还可以直接使用Python标准库itertools提供的函数。

>>> import itertools
>>> len(tuple(itertools.combinations(range(60),2)))
1770
#itertools还提供了排列函数permutations()。

>>> import itertools
>>> for item in itertools.permutations(range(1,4),2):
	print(item)

输出菱形

def main(n):
    for i in range(n):
        print((' * '*i).center(n*3))
    for i in range(n, 0, -1):
        print((' * '*i).center(n*3))

 进制转换

def int2base(n, base):
    '''把十进制整数n转换成base进制'''
    result = []
    div = n
    #除基取余,逆序排列
    while div != 0:
        div, mod = divmod(div, base)
        result.append(mod)
    result.reverse()    
    result = ''.join(map(str, result))
    #变成数字,返回
    return eval(result)

字符串

使用指定分隔符将列表中所有字符串元素连接成一个字符串。

>>> def Join(List,sep=None):
   	   return (sep or ' ').join(List)
>>> aList = ['a', 'b', 'c']
>>> Join(aList)
'a b c'
>>> Join(aList, ',')
'a,b,c'

最大公约数

递归

def func(a,b)
    if a < b :
        a,b = b,a
    r = a % b
    if r == 0 :
        return b
    else :
        return func(b,r)
ans = func(342,84)
print(ans)

移位

【题目】编写函数,接收包含20个整数的列表lst和一个整数k作为参数,返回新列表。处理规则为:将列表lst中下标k之前的元素逆序,下标k之后的元素逆序,然后将整个列表lst中的所有元素再逆序。

def demo(lst,k):
    x = lst[:k]
    x.reverse()
    y = lst[k:]
    y.reverse()
    r = x+y
    r.reverse()
    return r

lst = list(range(1,21))
print(demo(lst,5))

本例的执行结果实际上是把列表中所有元素循环左移k位。在collections标准库的deque对象已经实现了该功能,直接调用即可。

>>> import collections
>>> x = list(range(20))
>>> x = collections.deque(x)
>>> x
deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
>>> x.rotate(-3)
>>> x
deque([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2])
>>> x = list(x)
>>> x
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2]

【优化】

>>> def shift(lst, k):
	return lst[k:]+lst[:k]

>>> x = list(range(20))
>>> shift(x, 3)
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 1, 2]
>>> shift(x, -3)
[17, 18, 19, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

七段数码管 

基本思路

  1. 绘制单个数字对应的数码管
  2. 获得一串数字,绘制对应的数码管
  3. 获得当前系统时间,绘制对应的数码管

 

  1. 七段数码管由7个基本线条组成
  2. 七段数码管可以有固定顺序
  3. 不同数字显示不同的线条

 【题目】编写程序,使用七段数码管实现任意日期的显示

import turtle as tl
import time
t = time.gmtime()
td = time.strftime("%Y-%m=%d+", t)      #获取当前系统时间,年月日
def drawLine(draw):
    tl.pendown() if draw else tl.penup()
    tl.fd(40)
    tl.right(90)
def drawDigit(digit):
    drawLine(True) if digit in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 1, 3, 4, 5, 7, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 6, 8] else drawLine(False)
    tl.left(90)
    drawLine(True) if digit in [0, 4, 5, 6, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
    drawLine(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
    tl.left(180)
    tl.penup()
tl.fd(20)
def drawDate(date):
    tl.pencolor("green")
    for i in date:
        if i == "-":
            tl.write("年", font=("Arial", 30, "normal"))
            tl.pencolor("green")
            tl.fd(60)
        elif i == "=":
            tl.write("月", font=("Arial", 30, "normal"))
            tl.pencolor("green")
            tl.fd(60)
        elif i == "+":
            tl.write("日", font=("Arial", 30, "normal"))
            tl.pencolor("yellow")
            tl.fd(60)
        else:
            drawDigit(eval(i))
def main():
    tl.setup(800, 350, 300, 300)
    tl.penup()
    tl.fd(-300)
    tl.pensize(5)
    drawDate(td)
    tl.hideturtle()
    tl.down()
    
main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值