该系列为南京大学课程《用Python玩转数据》学习笔记,主要以思维导图的记录
控制结构和函数编程练习
1. 身体质量指数(BMI,Body Mass Index)是国际上常用的衡量人体肥胖程度和是否健 康的重要标准,计算公式为:BMI=体重/身高的平方(国际单位 kg/m²)。中国的成年人 BMI 数值定义为:
过轻:低于 18.5
正常:18.5-23.9
过重:24-27.9
肥胖:高于 28
请输入体重和身高,输出相应的 BMI 值和体重肥胖程度判断结果(too thin、normal、 overweight 或 fat)。[输入样例] 60,1.6 [输出样例]
Your BMI is 23.4 normal[提示]
程序中体重和身高的输入可用“weight, height = eval(input())”语句表示。1
2
3
4
5
6
7
8
9
10
11def exercise1():
weight, height = eval(input('Please input your weight and height:'))
bmi = weight / (height ** 2)
if bmi < 18.5:
print('Your BMI is {:.1f} {}'.format(bmi, 'too thin'))
elif bmi < 24:
print('Your BMI is {:.1f} {}'.format(bmi, 'normal'))
elif bmi < 28:
print('Your BMI is {:.1f} {}'.format(bmi, 'overweight'))
else:
print('Your BMI is {:.1f} {}'.format(bmi, 'fat'))2. 按公式:C= 5/9×(F-32) ,将华氏温度转换成摄氏温度,并产生一张华氏 0~300 度与
对应的摄氏温度之间的对照表(每隔 20 度输出一次)1
2
3
4def exercise2():
for i in range(0, 301, 20):
c = 5 / 9 * (i - 32)
print('{:d}华氏度:{:.0f}摄氏度'.format(i, c))3. 角谷静夫是日本的一位著名学者,他提出了一个猜想(称为角谷猜想):对于一个正整数 n,若为偶数则除以 2,若为奇数则乘以 3 加 1,得到一个新的数后按照之前的两条规则继续演算,若干次后得到的结果必然为 1。输入任一正整数,输出演算过程。
[输入样例]
10
[输出样例]
10/2=5
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=11
2
3
4
5
6
7
8
9def exercise3():
n = eval(input('Please input a number:'))
while n != 1:
if n % 2 == 1:
print("{}*3+1={}".format(n, 3 * n + 1))
n = n * 3 + 1
else:
print("{}/2={}".format(n, n // 2))
n //= 24. 输入 n,用递推法(例如前项之间的关系推导后项,本题为一重循环)编程求 1+2!+3!+…+n!的和并输出。
[输入样例]5
[输出样例]
1531
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16def exercise4():
n = eval(input('Please input a number:'))
# 方法一
# out = 0
# for i in range(1, n + 1):
# if i == 1:
# out += 1
# else:
# out += reduce(lambda x, y: x*y, range(1, i + 1))
# print(out)
# 方法二
s = term = 1
for i in range(2, n + 1):
term *= i
s += term
print(s)5. 编程求解 1-4 这 4 个数字可以组成多少个无重复的三位数,按从小到大的顺序输出这些
数字。1
2
3
4
5
6def exercise5():
for i in range(1, 5):
for j in range(1, 5):
for k in range(1, 5):
if i !=j and j!=k and i !=k:
print(i*100 + j*10 + k)6. 验证命题:如果一个三位整数是 37 的倍数,则这个整数循环左移后得到的另两个 3 位
数也是 37 的倍数。(注意验证命题的结果输出方式,只要输出命题为真还是假即可,而
非每一个三位数都有一个真假的输出)1
2
3
4
5
6
7
8
9
10def exercise6():
for n in range(100, 1001):
if n % 37 == 0:
n1 = n // 100 + n % 100 * 10
n2 = n // 10 + n % 10 * 100
if n1 % 37 != 0 or n2 % 37 != 0:
print("It's a false proposition.")
break
else:
print("It's a true proposition.")7. 一个数如果等于它的因子之和则称这个数为完数,例如 6,6=1+2+3,编程计算 1000
之内的所有完数并输出。1
2
3
4
5
6
7
8
9
10def exercise7():
for n in range(1, 1001):
s = 0
factors = []
for i in range(1, n):
if n % i == 0:
s += i
factors.append(str(i))
if s == n:
print('{}={}'.format(n, '+'.join(factors)))8. 验证哥德巴赫猜想之一:2000 以内的正偶数(大于等于 4)都能够分解为两个质数之
和。每个偶数表达成形如:4=2+2 的形式。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15def exercise8():
for n in range(4, 2001, 2):
for i in range(2, n):
if isPrime(i) and isPrime(n-i) and i < n-i:
print('{}={}+{}'.format(n,i,n-i))
def isPrime(n):
if n == 1:
return False
for i in range(2, n):
if n % i == 0:
return False
else:
return True
测试:控制结构和函数编程题
题目内容:
对于两个不同的整数A和B,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将A和B称为亲密数。自定义函数fac(x)计算x包括1但不包括本身的所有因子和并返回。从键盘输入整数n,调用fac()函数寻找n以内的亲密数并输出。注意每个亲密数对只输出一次,小的在前大的在后,例如220-284。
输入格式:
按提示用input()函数输入
输出格式:
按样例形式,可使用形如“print(“{}-{}”.format(参数1, 参数2))”输出语句进行亲密数对的输出
输入样例:
500
输出样例:
220-284
1
2
3
4
5
6
7
8
9
10
11
12
13def fac(n):
out = 0
for i in range(1, n):
if n % i == 0:
out += i
return out
n = int(input())
for a in range(1, n):
b = fac(a)
if fac(b)== a and a < b:
print("{}-{}".format(a, b))题目内容:
找第n个默尼森数。P是素数且M也是素数,并且满足等式M=2^P-1,则称M为默尼森数。例如,P=5,M=2^P-1=31,5和31都是素数,因此31是默尼森数。
输入格式:
按提示用input()函数输入
输出格式:
int类型
输入样例:
4
输出样例:
127
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26def prime(num):
if num == 1:
return False
for i in range(2, num):
if num % i == 0:
return False
else:
return True
def monisen(no):
i = 0
j = 1
while i < no:
while True:
if prime(j):
m = 2 ** j - 1
if prime(m):
j += 1
break
j += 1
i += 1
return m
print(monisen(int(input())))