求素数
【题目】下面的代码用来计算小于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]
七段数码管
基本思路
- 绘制单个数字对应的数码管
- 获得一串数字,绘制对应的数码管
- 获得当前系统时间,绘制对应的数码管
- 七段数码管由7个基本线条组成
- 七段数码管可以有固定顺序
- 不同数字显示不同的线条
【题目】编写程序,使用七段数码管实现任意日期的显示
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()