python题

Python0002排列组合序列

题目描述

用户输入整数n1<=n<=26)和整数mm<=n),然后输入n个不同的字母,请编写程序输出在这n个字母中选择m个字母的所有排列序列和组合序列。

【源代码程序】

import itertools

 

def generate_permutations_combinations(letters, m):

    # 生成排列序列

    permutations = list(itertools.permutations(letters, m))

    print("排列序列:")

    for perm in permutations:

        print(''.join(perm))

    

    # 生成组合序列

    combinations = list(itertools.combinations(letters, m))

    print("\n组合序列:")

    for comb in combinations:

        print(''.join(comb))

 

def main():

    n = int(input("请输入整数n(1<=n<=26):"))

    m = int(input("请输入整数m(m<=n):"))

    

    if not 1 <= n <= 26 or not 1 <= m <= n:

        print("输入不符合要求!")

        return

    

    letters = []

    for i in range(n):

        letter = input("请输入第{}个字母:".format(i+1))

        letters.append(letter)

    

    generate_permutations_combinations(letters, m)

 

if __name__ == "__main__":

    main()

 

 运行测试

 

)、【Python0003蒙特·卡罗法计算圆周率

题目描述

蒙特·卡罗方法是一种通过概率来得到问题近似解的方法,在很多领域都有重要的应用,其中就包括圆周率近似值的计问题。假设有一块边长为2的正方形木板,上面画一个单位圆,然后随意往木板上扔飞镖,落点坐标(x,y)必然在木板上(更多的时候是落在单位圆内),如果扔的次数足够多,那么落在单位圆内的次数除以总次数再乘以4,这个数字会无限逼近圆周率的值。这就是蒙特·卡罗发明的用于计算圆周率近似值的方法。编写程序,模拟蒙特·卡罗计算圆周率近似值的方法,输入掷飞镖次数,然后输出圆周率近似值。

【源代码程序】

import random

 

def monte_carlo_pi(num_throws):

    inside_circle = 0

 

    for _ in range(num_throws):

        # 随机生成飞镖的坐标

        x = random.uniform(-1, 1)

        y = random.uniform(-1, 1)

 

        # 判断飞镖是否落在单位圆内

        if x**2 + y**2 <= 1:

            inside_circle += 1

 

    # 计算圆周率的近似值

    pi_approx = (inside_circle / num_throws) * 4

    return pi_approx

 

def main():

    num_throws = int(input("请输入掷飞镖次数: "))

    

    if num_throws <= 0:

        print("次数必须是正整数!")

        return

 

    pi_approx = monte_carlo_pi(num_throws)

    print("圆周率的近似值为:", pi_approx)

 

if __name__ == "__main__":

    main()

 

 运行测试

 

)、【Python0004验证6174猜想

题目描述

1955年,卡普耶卡(D.R.Kaprekar)对4位数字进行了研究,发现一个规律:对任意各位数字不相同的4位数,使用各位数字能组成的最大数减去能组成的最小数,对得到的差重复这个操作,最终会得到6174这个数字,并且这个操作最多不会超过7次。请编写程序验证这个猜想。

【源代码程序】

def kaprekar_iteration(num):

    # 将数字转换为4位数的字符串

    num_str = '{:04d}'.format(num)

 

    # 转换为列表方便排序

    digits = list(num_str)

 

    # 排序得到最大数和最小数

    max_num = int(''.join(sorted(digits, reverse=True)))

    min_num = int(''.join(sorted(digits)))

 

    # 计算差值

    diff = max_num - min_num

    return diff

 

def verify_kaprekar_conjecture():

    # 初始化初始数字和迭代次数

    num = int(input("请输入一个各位数字不相同的4位数: "))

    iterations = 0

 

    # 迭代直到得到6174或者达到最大迭代次数

    while num != 6174 and iterations < 7:

        num = kaprekar_iteration(num)

        print(num)

        iterations += 1

 

    # 输出结果

    if num == 6174:

        print("经过", iterations, "次迭代,验证了6174猜想。")

    else:

        print("迭代次数超过7次,未能验证6174猜想。")

 

if __name__ == "__main__":

    verify_kaprekar_conjecture()

 

 运行测试

 

)、【Python0005模拟页面调度LRU算法

题目描述

所谓LRU算法,是指在发生缺页并且没有空闲主存块时,把最近最少使用的页面换出主存块,腾出地方来调入新页面。

问题描述:一进程获得n个主存块的使用权,对于给定的进程访问页面次序,问当采用LRU算法时,输出发生的缺页次数。

【源代码程序】

def lru(page_sequence, num_frames):

    # 使用一个列表来模拟主存块

    frames = []

 

    # 记录缺页次数

    page_faults = 0

 

    for page in page_sequence:

        # 如果页面已经在主存块中,则将其移到列表末尾表示最近使用

        if page in frames:

            frames.remove(page)

            frames.append(page)

        else:

            # 如果主存块未满,则直接将页面加入

            if len(frames) < num_frames:

                frames.append(page)

            else:

                # 如果主存块已满,则移除最近最少使用的页面,即列表头部的页面

                frames.pop(0)

                frames.append(page)

            # 缺页次数加1

            page_faults += 1

 

    return page_faults

 

def main():

    # 输入页面访问序列和主存块数量

    page_sequence = list(map(int, input("请输入页面访问序列(以空格分隔): ").split()))

    num_frames = int(input("请输入主存块数量: "))

 

    # 调用LRU算法模拟页面调度

    faults = lru(page_sequence, num_frames)

 

    # 输出缺页次数

    print("缺页次数:", faults)

 

if __name__ == "__main__":

    main()

 

 运行测试

 

)、【Python0006爬楼梯

题目描述

 假设一段楼梯共n(n>1)个台阶,小朋友一步最多能上3个台阶,那么小朋友上这段楼梯一共有多少种方法。

【源代码程序】

def count_ways(n):

    # 初始化前三个台阶的上楼梯方法数

    if n == 1:

        return 1

    elif n == 2:

        return 2

    elif n == 3:

        return 4

 

    # 初始化台阶n的上楼梯方法数

    ways = [0] * (n + 1)

    ways[1] = 1

    ways[2] = 2

    ways[3] = 4

 

    # 计算台阶i的上楼梯方法数

    for i in range(4, n + 1):

        ways[i] = ways[i - 1] + ways[i - 2] + ways[i - 3]

 

    return ways[n]

 

def main():

    n = int(input("请输入台阶数n(n>1): "))

    if n <= 1:

        print("台阶数必须大于1!")

        return

 

    ways = count_ways(n)

    print("小朋友上{}个台阶共有{}种方法。".format(n, ways))

 

if __name__ == "__main__":

    main()

 

 运行测试

 

)、【Python0007杨辉三角形

题目描述

输出n0<n)行杨辉三角形,n由用户输入。

【源代码程序】

def generate_pascal_triangle(n):

    triangle = []

 

    for i in range(n):

        row = [1] * (i + 1)

        for j in range(1, i):

            row[j] = triangle[i - 1][j - 1] + triangle[i - 1][j]

        triangle.append(row)

 

    return triangle

 

def print_pascal_triangle(triangle):

    for row in triangle:

        print(" ".join(map(str, row)))

 

def main():

    n = int(input("请输入杨辉三角形的行数n(n>0): "))

    if n <= 0:

        print("请输入大于0的行数!")

        return

 

    pascal_triangle = generate_pascal_triangle(n)

    print("杨辉三角形如下:")

    print_pascal_triangle(pascal_triangle)

 

if __name__ == "__main__":

    main()

 

运行测试

 

)、【Python0008筛法求素数

题目描述

用户输入整数nm1<n<m<1000),应用筛法求[n,m]范围内的所有素数。

【源代码程序】

def sieve_of_eratosthenes(n, m):

    primes = [True] * (m + 1)

    primes[0] = primes[1] = False

 

    p = 2

    while p * p <= m:

        if primes[p]:

            for i in range(p * p, m + 1, p):

                primes[i] = False

        p += 1

 

    prime_numbers = []

    for i in range(n, m + 1):

        if primes[i]:

            prime_numbers.append(i)

 

    return prime_numbers

 

def main():

    n = int(input("请输入整数n(1<n): "))

    m = int(input("请输入整数m(n<m): "))

    if n >= m or n <= 1:

         print("输入不符合要求!")

         return

        

    prime_numbers = sieve_of_eratosthenes(n, m)

    print("在范围[{}, {}]内的素数为:".format(n, m))

    print(prime_numbers)

if __name__ == "__main__":

   main()

 

运行测试

 

十一)、【Python0009查找鞍点

题目描述

对于给定5X5的整数矩阵,设计算法查找出所有的鞍点的信息(包括鞍点的值和行、列坐标,坐标从1开始)

提示:鞍点的特点:列上最小,行上最大。

【源代码程序】

'''求矩阵的靶点,即在矩阵行上最小而在列上最大的点'''

 

def get_andian(n):

    #生成矩阵,将矩阵的元素存入广义表中,相当于C语言中的二维数组

    i = 0

    juzhen = []

    while True:

        if i >= n:

            break

        else:

            hang = list(map(int,input("请按行输入矩阵的值,用空格隔开:").split(' ')))

            i += 1

            juzhen.append(hang)

    #打印矩阵

    print("矩阵:")

 

    for i in juzhen:

        for j in i:

            print(j,end=' ')

        print('')

    #找鞍点

    x = 0

    for h in juzhen:

        key = min(h) #找出每一行中最小值,然后再判断该最小值在矩阵这一列中是否为最大值

        y = h.index(key)

        if key >= max([hang[h.index(key)] for hang in juzhen]):

            print("鞍点位置:(%d,%d)" %(x,y))

            print(key)

        x += 1

 

if __name__ == '__main__':

    n = int(input("请输入矩阵行数n:"))

    get_andian(n)

运行测试

 

十二)、【Python0010】正整数的因子展开式

题目描述

编写程序,输出一个给定正整数xx>1的质因子展开式。

【源代码程序】

def prime_factors(n):

    factors = []

    divisor = 2

 

    while n > 1:

        if n % divisor == 0:

            factors.append(divisor)

            n //= divisor

        else:

            divisor += 1

 

    return factors

 

def factor_expansion(x):

    factors = prime_factors(x)

    result = ''

 

    for factor in factors:

        power = 0

        while x % factor == 0:

            power += 1

            x //= factor

        if power > 1:

            result += f"{factor}^{power} × "

        else:

            result += f"{factor} × "

 

    return result[:-3]

 

def main():

    x = int(input("请输入一个正整数(大于1): "))

    if x <= 1:

        print("请输入大于1的正整数!")

        return

 

    expansion = factor_expansion(x)

    print(f"{x}的质因子展开式为:{expansion}")

 

if __name__ == "__main__":

    main()

 

运行测试

 

十三)、【Python0011牛顿迭代法

题目描述

编写程序,使用牛顿迭代法求方程x附近的一个实根。

【源代码程序】

def newton_method(f, df, x0, tol=1e-6, max_iter=100):

    """

    牛顿迭代法求解方程实根

    :param f: 方程函数

    :param df: 方程导函数

    :param x0: 初值

    :param tol: 允许误差

    :param max_iter: 最大迭代次数

    :return: 实根近似值

    """

    x = x0

    iteration = 0

 

    while abs(f(x)) > tol and iteration < max_iter:

        x = x - f(x) / df(x)

        iteration += 1

 

    if iteration == max_iter:

        print("达到最大迭代次数,未能收敛到根。")

    else:

        print("经过", iteration, "次迭代,得到根的近似值为:", x)

 

def main():

    # 定义方程函数及其导函数

    def f(x):

        return x**3 - 2*x - 5

 

    def df(x):

        return 3*x**2 - 2

 

    # 设置初值和迭代参数

    x0 = float(input("请输入初值x0: "))

    tol = float(input("请输入允许误差(tol): "))

    max_iter = int(input("请输入最大迭代次数(max_iter): "))

 

    # 使用牛顿迭代法求解方程实根

    newton_method(f, df, x0, tol, max_iter)

 

if __name__ == "__main__":

    main()

 

运行测试

 

实验分析及问题思考

Python0012】针对Python中的列表、元组、字典、集合、字符串,请以条目形式从各方面对比它们之间的异同。

【答案】 

 

1.列表(List):

异同点:

列表是一种有序、可变的数据结构,可以存储任意类型的元素。

列表使用方括号[]来表示,元素之间用逗号,分隔。

列表中的元素可以通过索引访问和修改。

列表中可以包含重复元素。

例:

 # 创建一个列表

my_list = [1, 2, 3, 4, 5]

 

# 访问列表中的元素

print(my_list[0])  # 输出:1

 

# 修改列表中的元素

my_list[0] = 10

print(my_list)  # 输出:[10, 2, 3, 4, 5]

元组(Tuple):

异同点:

元组也是一种有序的数据结构,但是是不可变的,一旦创建就不能修改。

元组使用圆括号()来表示,元素之间用逗号,分隔。

元组中的元素可以通过索引访问,但不能修改。

元组中可以包含重复元素。

例:

# 创建一个元组

my_tuple = (1, 2, 3, 4, 5)

 

# 访问元组中的元素

print(my_tuple[0])  # 输出:1

 

# 尝试修改元组中的元素(会报错)

# my_tuple[0] = 10  # TypeError: 'tuple' object does not support item assignment

 字典(Dictionary):

异同点:

字典是一种无序的数据结构,以键值对的形式存储数据。

字典使用花括号{}来表示,每个键值对之间用逗号,分隔,键和值之间用冒号:分隔。

字典中的键必须是唯一的,但值可以重复。

字典中的元素可以通过键来访问和修改。

例:

# 创建一个字典

my_dict = {'name': 'Alice', 'age': 30, 'city': 'New York'}

 

# 访问字典中的元素

print(my_dict['name'])  # 输出:Alice

 

# 修改字典中的元素

my_dict['age'] = 31

print(my_dict)  # 输出:{'name': 'Alice', 'age': 31, 'city': 'New York'}

集合(Set):

异同点:

集合是一种无序且不重复的数据结构。

集合使用花括号{}来表示,元素之间用逗号,分隔。

集合不支持索引,因此不能通过索引访问和修改元素。

集合可以执行并集、交集、差集等操作。

例:

# 创建一个集合

my_set = {1, 2, 3, 4, 5}

 

# 添加元素到集合中

my_set.add(6)

print(my_set)  # 输出:{1, 2, 3, 4, 5, 6}

 

# 尝试通过索引访问集合中的元素(会报错)

# print(my_set[0])  # TypeError: 'set' object does not support indexing

字符串(String):

异同点:

字符串是由字符组成的有序序列。

字符串是不可变的,一旦创建就不能修改。

字符串可以通过索引访问其中的字符,但不能修改。

字符串可以进行拼接、切片、查找、替换等操作。

例:

# 创建一个字符串

my_string = "Hello, World!"

 

# 访问字符串中的字符

print(my_string[0])  # 输出:H

 

# 尝试修改字符串中的字符(会报错)

# my_string[0] = 'h'  # TypeError: 'str' object does not support item assignment

posted @ 2024-04-27 22:43  艾鑫4646  阅读(37)  评论(0编辑  收藏  举报