python笔记1(杨辉三角、质数问题)

1、math的一些常用函数

print(round(2.5)) #round()是四舍六入,五取偶;不是math下面的函数
print(round(1.2))
import math
print(math.floor(2.5)) #向下取整
print(math.ceil(2.5))  #向上取整
print(math.sqrt(3))   #开平方
print(math.pi) #pai
print(math.e) #自然常数

2、杨辉三角

lst=[]
n=6
for i in range(n):
    row=[1]
    lst.append(row)
    if i==0:
        continue
    for j in range(i-1):
         row.append(lst[i-1][j]+lst[i-1][j+1])
    else:
        row.append(1)
print(lst)

结果:

[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1]]
#改进
n=6
p=[]
for i in range(n): #每一个行遍历
    row=[1] #每行开头都给一个1 
    for k in range(i):  #每一行尾部给1
        row.append(1) if k==i-1 else row.append(0) #改进:可以直接给每一行的元素全部赋值为1
    p.append(row)  #,后面再对中间的数进行重新赋值
    if i==0: #对于第一行特殊对待,不进行下面的赋值运算
        continue
    for j in range(1,i//2+1): #对每一行的一半元素进行处理直到中间的元素
        val=p[i-1][j-1]+p[i-1][j]#每次以上一行的元素进行相加
        row[j]=val #每一个元素加入到row中
        if j!=i-j: #这是对奇数个数的中间点跳过
            row[-j-1]=val #利用列表的倒序来对称赋值
print(p)            #如p[-1]为列表p的倒数第一个

结果:

[[1], [1, 1], [1, 2, 1], [1, 3, 3, 1], [1, 4, 6, 4, 1], [1, 5, 10, 10, 5, 1]]

 

 打印杨辉三角第n行第m个数:

#改进
a=6
lst=[]
k=5
for i in range(a):
    row=[1]*(i+1)
    lst.append(row)
    if i==0:
        continue
    for j in range(1,i//2+1):
        val=lst[i-1][j-1]+lst[i-1][j]
        row[j]=val
        if j!=i-j:
            row[-j-1]=val
print(lst[a-1][k-1])    #打印第a行,第k列

 

### 改进:根据杨辉三角定理:第n行的m个数可以表示为C(n-1,m-1),即为从n-1个不同元素中取m-1个元素的组合数C(n,r)=n!/(r!(n-r)!)

n=10
k=5
n,r=n-1,k-1
d=n-r
lst=[] #用来装n,r,d
temp=1
for i in range(1,n+1):  
    temp*=i
    if i==r:     #利用一个循环把阶乘过程中所要截取的阶乘用if语句截断下来
        lst.append(temp)  #最先加进去的是最小的,所以与if的先后无关
    if i==d:
        lst.append(temp)  #即[0][1],[2]分别是d,r以及n
    if i==n:
        lst.append(temp)  #三个条件不要写在一起了,因为逻辑不允许,如果有两两相等就会出错
print(lst[2]//(lst[1]*lst[0])) 

 

3、求10万以内的质数方法时间效率的比较

#改进
import
math n=100000 p=[] count=0 flag=True start=datetime.datetime.now() for x in range(2,n): for i in p: count+=1 if x%i==0: flag=False break if i>=math.ceil(x**0.5): flag=True break if flag: p.append(x) delta=(datetime.datetime.now()-start).total_seconds() print(len(p)) print(count) print(delta)

结果:

9592
754026
0.447888

import math
import datetime
n=100000
p=[]
count=0
start=datetime.datetime.now()
for x in range(2,n):
    for i in p:
        count+=1
        if(x%i)==0:
            break
    else:
        p.append(x)
delta=(datetime.datetime.now()-start).total_seconds()
print(len(p))
print(count)
print(delta)

结果:

9592
46314476
9.33169
posted @ 2019-12-10 15:53  二十四长夜明  阅读(274)  评论(0编辑  收藏  举报