Python基础之Python面面观3

该系列为南京大学课程《用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
    11
    def 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
    4
    def 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=1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    def 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 //= 2
  • 4. 输入 n,用递推法(例如前项之间的关系推导后项,本题为一重循环)编程求 1+2!+3!+…+n!的和并输出。
    [输入样例]

    5
    [输出样例]
    153

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    def 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
    6
    def 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
    10
    def 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
    10
    def 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
    15
    def 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
    13
    def 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
    26
    def 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())))