学习python的第四天
作业
1.找出100~999之间的水仙花数(各位数字的立方和刚好等于这个数本身)
153 = 1^3 + 5^3 + 3^3
123 // 100 = 1 ---> 23
123 // 10 --> 12 % 10 --> 2
123 % 100 --> 23 // 10 --> 2
123 % 10 = 12 ---> 3
567 // 100 = 5 ---> 67
567 % 10 = 56 ---> 7
for num in range(100, 1000):
bw = num // 100
sw = num // 10 % 10
gw = num % 10
if bw ** 3 + sw ** 3 + gw ** 3 == num:
print(num)
2.找出1~10000之间的完美数(除自身外所有因子的和等于这个数) 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14
for i in range(1,10001):
total=0
for j in range(1,i):
if i%j==0:
total +=j
if i==total:
print(i)
然而该代码的执行效率却不行,我们将代码改成如下代码
import time
start =time.time()
for num in range(2,10000):
total=1
for i in range(2,int(num**0.5)+1):#范围+1
if num %i == 0:
total += i
if i!=num // i:
total += num //i
if num == total:
print(num)
end = time.time()
print(f'执行时间:{end-start:0.3f}秒')
从修改后代码中,我运用了import相关的函数,同时在第二for…in…循坏里我们将range的范围缩小,将num进行的开根号,从而使效率极大提高,减轻了内存的运行。
3.输入两个非负整数m和n(m >= n),计算C(m, n)的值A(m, n) = m! / (m - n)! —> 排列 —> permutation
C(m, n) = m! / n! / (m - n)! —> 组合 —> combination
C(5, 3) = 5! / 3! / 2! = 10
m = int(input('m='))
n = int(input('=n'))
fm =1
for i in range(2,m+1):
fm *=i
fn=1
for i in range(2,n+1):
fn *= 1
fk=1
for i in range(2,n+1):
fk *=i
print(fm//fn//fk)
在该代码中,可以import math,从math模块导入factorial函数并别名为f
as --> alias --> 别名:别名是什么名字就是什么名字
from math import factorial as fac
m = int(input('m = '))
n = int(input('n = '))
print(fac(m) // fac(n) // fac(m - n))
- 输入一个正整数,判断它是不是质数(只能被1和自身整除的数)例子:50 ----> 2 3 4 5 6 | 10 12 15 20 30
for num in range(1, 100):
is_prime = True
for i in range(2,int(num**0.5)+1):
# for i in range(2, num ):
if num % i == 0:
is_prime = False
break
# 注意这里的bool值、
if num > 1 and is_prime:
print(num, end=' ')
# 先找出某一状况找到相应的条件,并运用到外层的条件运用
- 输入三角形三条边的长度,如果能构成三角形就计算周长和面积,如果不能构成三角形,提示用户重新输入,直到正确。
while True:
a= float(input('a='))
b= float(input('b='))
c= float(input('c='))
if a+b>c and b+c>a and a+c>b:
perimeter = a+b+c
half=perimeter/2
# 海伦公式
area=(half*(half-a)*(half-c))**0.5
print(f'三角形的周长:{perimeter}')
print(f'三角形的面积:{area}')
break
else:
print('不能构成三角形')
课堂练习
2.补充练习:输入一个正整数n,将n进行反转
num = int(input('输入一个数:'))
total=0
while num > 0:
total=total*10+num%10
num //= 10
print(total)
- 白钱百鸡问题:
鸡翁一值钱5,鸡母一值钱3,鸡雏三值钱1,用百钱买百鸡,问鸡翁,母鸡,鸡雏
各几何
穷举法:穷尽所有的可能性,然后设置条件,找到问题的解 ----》暴力破解法
#条件范围是假设鸡翁之类的数量到20之类的
for x in range(0,21):
for y in range(0,34):
for z in range(0,100,3):
if x + y + z==100 and 5*x+3*y+z//3==100:
#没有20 0 0的结果,要满足100只的条件
print(x,y,z)
3.斐波拉切数
a,b= 1,1 #一定手动给
print(a,b,end=' ')
for _ in range(18):
#将这里的换成下划线,合法的变量名,在写循坏的时候变量用不上
a,b=b,a+b #把b的值赋给a,把a+b的值赋给b
print(b,end=' ')
4.乘法口诀
for i in range(1,10):
for j in range(1,i+1):
print(f'{i}*{j}={i*j}',end='\t')
print() #代表有换行
5.五个人(ABCDE
)晚上去埔鱼,然后i累了去睡觉。
第二天,A第一个醒过来,把鱼分成了5份,扔掉了多余的1条,然后拿走自己的的一份
B第二个醒过来,以为鱼没有分过,把剩下的鱼分成了5分,扔掉多余的一余
C,D,E依次醒过来,都按照同样的方法来分鱼,问他们最少捕了多少条鱼?
fish = 6
while True:
is_enough = True
#检查目前的鱼的数量够不够五人分
total=fish
for _ in range(5):
if (total - 1)%5 == 0:
total=(total - 1)//5 * 4
else:
is_enough=False
break
if is_enough:
print(fish)
break
fish += 5