Day3分支和循环作业详解

根据输入的成绩的范围打印及格 或者不及格。

grade = 67
if grade >= 60:
    print('及格')
else:
    print('不及格')

'''
grade = 67
符合grade >= 60
所以执行print('及格')
'''

1.根据输入的年纪范围打印成年或者未成年,如果年龄不在正常范围内(0~150)打印这不是人!

print('===============第1题================')
age = 89

# 方法一: if嵌套
if 0 <= age <= 150:
    if age >= 18:
        print('成年')
    else:
        print('未成年')
else:
    print('不是人!')

'''
age = 89
属于0 <= age <= 150范围内,所以执行第一个if内代码段
89 > 18 -> print('成年')
'''

# 方法二:
if age < 0 or age > 150:
    print('不是人!')
elif age >= 18:
    print('成年人')
else:
    print('未成年人')

'''
age = 89
0 < 89 <150 --> elif 89 > 18 --> print('成年人')
'''

2.输入两个整数a和b,若a-b的结果为奇数,则输出该结果,否则输出提示信息a-b的结果不是奇数。

print('===============第2题================')
a = 34
b = 21
# 方法一:
result = a-b if (a-b) & 1 else '结果不是奇数'
print(result)

'''
三目运算
(a - b) & 1 --> 1
if 1 --> 执行(a - b)
'''

# 方法二:
if (a-b) & 1 == 1:
    print(a-b)
else:
    print('结果不是奇数')

'''
(a - b) & 1 == 1 为True
执行if语句 --> print(a - b)
'''

3.使用while循环输出 0~100内所有3的倍数。

print('===============第3题================')
# 方法一:
num = 0
while True:
    num += 3
    if num > 100:
        break
    print(num)

'''
num = 0
while True --> 条件为真,while循环为死循环
num += 3 --> 每循环一次,num的值加3,判断是否符合num > 100的条件,不符合,执行print(num)
num += 3 --> num = 102 触发 if num > 100: break --> 跳出循环,循环结束
'''

print('========================================')
num = 0
while num <= 100:
    num += 3
    print(num)

'''
num = 0 符合 while num <= 100 --> num += 3
num += 3 --> num = 102 --> 不满足num <= 100:循环结束
'''

4.使用循环计算1234…*10的结果。

print('===============第4题================')
sum1 = 1
for num in range(1, 11):
    sum1 *= num
print(sum1)

'''
for循环,range(1,11) --> 循环10次,循环第几次,num 取值为几
sum1 *= num --> 执行累乘
循环结束,print(sum1)
'''

5.统计100以内个位数是2并且能够被3整除的数的个数。

print('===============第5题================')
# 方法一:
count = 0
for num in range(100):
    if num % 10 == 2 and num % 3 == 0:
        count += 1
print(count)

'''
range(100) -->从0循环到99
num % 10 == 2 获取个位数为2的数
num % 3 == 0 获取3的倍数
符合上述两种条件,count += 1,个数加1
循环结束,print(count)
'''
# 方法二:
count = 0
for num in range(0, 100, 3):
    if num % 10 == 2:
        count += 1
print(count)

'''
range(0,100,3) --> 从0开始,到99结束,步长为3,循环33次
num % 10 == 2 --> 符合条件,count += 1
'''
# 方法三:
count = 0
for num in range(2, 100, 10):
    if num % 3 == 0:
        count += 1
print(count)

'''
range(2, 100, 10) --> 从2开始,92结束,步长为10
num % 3 == 0 --> 符合条件:count += 1
'''

6.输入任意一个正整数,求他是几位数?

"""
123(3) - 123//10 -> 12//10 -> 1//10 -> 0
78(2)  -  78//10 -> 7//10 -> 0
3(1) -  3//10 -> 0
0(1) -  0//10 -> 0
23424(5) - 23424//10 -> 2342//10 -> 234//10 -> 23//10 -> 2//10 -> 0
"""
print('===============第6题================')
num = 10
count = 0
while True:
    num //= 10
    count += 1
    if num == 0:
        break
print(count)

'''
不确定循环次数,设置while死循环
num //= 10 --> count += 1
判断num == 0
如果num != 0,再次进入循环cnum //= 10,count += 1
如果num == 0,break跳出循环,print(count)
'''

7.打印出所有的水仙花数,所谓水仙花数是指一个三位数,其各位数字⽴方和等于该数本身。例如:153是

⼀个⽔仙花数,因为 1³ + 5³ + 3³ 等于 153。

print('===============第7题================')
for num in range(100, 1000):
    ge = num % 10
    shi = num // 10 % 10    # shi = num % 100 // 10
    bai = num // 100
    if ge**3 + shi**3 + bai**3 == num:
        print(num)

'''
水仙花数是三位数,所以range(100,1000)
ge = num % 10
shi = num // 10 % 10
bai = num // 100
上述三个条件分别获取每个三位数的个位、十位、百位
ge**3 + shi**3 + bai**3 == num --> 判断属不属于条件
输入,print(num);不属于,再次循环判断
'''

8.判断指定的数是否是素数(素数就是质数,即除了1和它本身以外不能被其他的数整除的数)

"""
思路:N是否是素数就看在2~N-1之间有没有一个数能够被N整除
"""
print('===============第8题================')
num = 121

# 方法一:
for x in range(2, num):
    if num % x == 0:
        print('不是素数')
        break
else:
    print('素数')

'''
原始计算方法:
根据素数定义,range(2,num),从2循环到输入的数的前一位
每循环一次,判断num % x == 0,如果符合条件,print('不是素数')并且执行break跳出循环
否则print('素数')
'''

# 方法二:(优化循环次数)
# x = m*n (m较小、n较大,那么m一定是小于等于x的开平方)
for x in range(2, int(num**0.5)+1):
    if num % x == 0:
        print('不是素数')
        break
else:
    print('素数')

'''
优化循环次数:
range(2,int(num**0.5)+1) -> 每个数的因子只在这个数的一半以内,减少num/2的循环次数
每循环一次,判断num % x == 0,如果符合条件,print('不是素数')并且执行break跳出循环
否则print('素数')
'''

9.求斐波那契数列列中第n个数的值:1,1,2,3,5,8,13,21,34… (这儿的n可以是任意正整数,可以通过输入来确定)

有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?

"""
1月兔    2月兔     3月兔
1       0         0                 1
0       1         0                 1
1       0         1                 2
1       1         1                 3
2       1         2                 5
3       2         3                 8
5        3        5                13
"""
print('===============第9题================')
n = 6
if n == 1 or n == 2:
    print(1)
else:
    p1 = p2 = 1
    for x in range(n-3):
        p1, p2 = p2, p1+p2

    print(p1+p2)

'''
斐波那契数列:从第三个数开始,每个数的值是前两个数的值的和
if n == 1 or n == 2:输入的数如果获取是数列的第一个或者第二个数,输出1
p1 = p2 = 1 --> 数列前两个数相等
range(n-3) --> 循环n-3次,并且是从数列第三个数开始循环
p1, p2 = p2, p1+p2 --> 每循环一次,便将p2的值赋值给p1,p2的值为p1+p2
循环结束,p1和p2是要获取的数的前两个数
print(p1+p2) --> 获取第n个数的值

'''

10.输出9*9口诀。 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。

print('===============第10题================')
for line in range(1, 10):
    for col in range(1, line+1):
        print(col, '×', line, '=', col*line, end='  ')
    # 一行结束后换行
    print()

'''
九九乘法表共9行9列
双重for循环:
range(1,10) --> 获取第i行n
range(1,line+1) --> 获取第i行的第j列
print(col, '×', line, '=', col*line, end='  ') --> 输出每一行的每个结果,并且在每个结果后面加' '(空格)以便与下一个隔开
print() --> 执行换行操作:'\n'
循环结束,梯形的九九乘法表形成
'''

11.这是经典的"百马百担"问题,有一百匹马,驮一百担货,大马驮3担,中马驮2担,两只小马驮1担,问有大,中,小马各几匹?(可以直接使用穷举法)

print('===============第11题================')
for b in range(0, 100//3+1):
    for m in range(0, 100//2+1):
        s = 100-b-m
        if b*3 + m*2 + s*0.5 == 100:
            print('大马:', b, '中马:', m, '小马:', s)

'''
双重for循环
range(0, 100//3+1) --> 用大马驮担,需要33匹大马
range(0, 100//2+1) --> 用中马驮担,需要50匹中马
s = 100-b-m --> 100-大马-中马==小马数s
if b*3 + m*2 + s*0.5 == 100:根据判断条件判断出每种方案各自需要大马、中马、小马的数量
输出
'''

你可能感兴趣的:(Python学习,IT,免费,python)