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")

 

posted @ 2021-10-08 10:43  JS_Pierre  阅读(113)  评论(0编辑  收藏  举报