PY学习记录#4
循环里面还要用range(,)函数的屑py
这个range还不包括最后一个数
T1
九九乘法表
这个题就是循环嵌套的经典应用了
可以很好的感受一下外层循环是如何影响内层循环的
内层循环次数随着外层循环次数增加而增加
最后输出一个三角形的形状
for i in range(1,10): for j in range(1,i+1): print(f"{i}*{j}={i*j}",end="\t") print("\n")
T2
阶乘
这个没啥好说的
代码对于老师的来说我做了一点小修改
直接从2开始循环
a=int(input()) n=1 for i in range (2,a+1): n*=i print(n)
T3
斐波那契数列前20位‘
斐波那契老经典了,这里用三种方法来做
先说老师的方法
这个方法其实不是非常好理解
主要原因是为了计算下一位
所以要不断滚动更新前两位的数值
每算出一个新的就把旧的更新过去
f,f1,f2=0,1,1 print(f) print(f1) print(f2) for i in range(3,21): #从第三位开始循环 f=f1+f2 #先计算下一位 f1=f2 #把原先的第二项改为第一项 f2=f #把新计算出来的给第二项,向前滚动更新 print (f)
滚动更新这个我不喜欢
我更喜欢开一个列表把每一位都存下来
真的简洁,但是费存储空间(但是多存几十个字节也没啥)
f=[0,1,1] for i in range(0,3): print(f[i]) for i in range(3,21): #从第三位开始循环 f.append(f[i-1]+f[i-2]) #计算下一位 print (f[i])
最后这种方法其实是斐波那契数列最经典的解法,递归法
只不过这个解法时间复杂度非常垃圾,还有爆系统栈的风险并且难以理解
先不解释,先放着。
def fib(a): if a==0: return 0 if a==1 or a==2: return 1 else: return fib(a-1)+fib(a-2) for i in range(1,21): print(fib(i))
T4
最大公约数
我这个解法比较暴力
因为最大公约数肯定小于两个数里面较小的那个
所以就在1和最小数之间挨个试一遍,保存最大的公约数
import math n=int(input()) m=int(input()) ans=0 x=min(n,m) for i in range(1,x+1): if m%i==0 and n%i==0: ans=i; print(ans)
当然有一种方式既高效还优雅
那就是辗转相除法
先上代码
T5
判断素数
判断素数这玩意展开讲能tm扯到数论上去
打印一个最大到n的素数表有最快O(n)的欧拉筛
还有好几种能做到O(nlogn)的筛法
然而这些咱都用不到
我们只需要会写暴力枚举法即可
枚举比它小的每一个数,只要有能整除的就立即结束循环
这里我设置了一个判断变量当哨兵用
也就是所谓的“哨兵循环”
当这个数不是素数以后就停止循环,打上标记
a=int(input()) flag=1 for i in range(2,a): if a%i==0: flag=0 break; if(flag==1): print("Yes") else: print("No")