一、实验目的:
(1)掌握循环的概念,能够用循环结构来解决算法问题
(2)熟练掌握实现遍历循环操作的for语句
(3)熟练掌握实现无线循环操作的while语句
(4)掌握用来辅助控制循环执行的break和continue语句
二、实验环境:
联网计算机一台/每人,内装Windows 7以上操作系统和安装Python 3.7集成开发环境IDLE。
三、实验内容:
1.有一个分数序列2/1,3/2,5/3,8/5,13/8,21/13,编程计算这个序列前20项之和。
2.设计一个“过七游戏”,这个游戏由5人以上参与,任意一人从1开始数数,当遇到7或者7的倍数或者含有数字7时,必须以敲桌子代替,报出的人输。
3.如果将20元换成零钱,要求只能换成1元、5元、10元的纸币,共有多少种方法。
4.编程计算自然对数e的近似值,要求其误差小于0.00001,公式为e=1+1/1!+1/2!+1/3!+…+1/n!+…。
5.编程找出1000以内的所有完数,一个数如果恰好等于它的因子之和,这个数称为完数,例如6=1+2+3。
四、实验步骤与结果
1. 新建文件夹并命名为学号-姓名-实验。
2. 安装 Python 解释器Python 3.7 集成开发环境IDLE,并进入IDLE。
3. 依次输入自己编好的程序实验内容1-7的源程序,分别命名为sy1_1.py - sy1_5.py 并保存至已建好的文件夹中。
4. 检查已输入的程序是否有错(包括输入时输错的和编程中的错误),如发现有错,及时改正。
5. 运行程序并分析运行结果是否合理。在运行时要注意当输入不同的数据时所得结果是否正确,应测试两组以上数据,分别检查在不同情况下结果是否正确。
列出1-5题源程序清单并记录上机运行结果。
1.有一个分数序列2/1,3/2,5/3,8/5,13/8,21/13,编程计算这个序列前20项之和。
源代码:
def fibonacci(n): # 生成斐波那契数列的前n个数字 fib_seq = [1, 1] # 开始的两个数字 while len(fib_seq) < n: fib_seq.append(fib_seq[-1] + fib_seq[-2]) return fib_seq def sum_of_fractions(n): # 计算分数序列的前n项之和 fib_seq = fibonacci(n+1) # 需要n+1个斐波那契数因为分数的分子与分母 total_sum = 0 for i in range(1, n+1): total_sum += fib_seq[i] / fib_seq[i-1] # fib_seq[i]是分子,fib_seq[i-1]是分母 return total_sum # 计算前20项之和 result = sum_of_fractions(20) print(result)
运行效果:
2.设计一个“过七游戏”,这个游戏由5人以上参与,任意一人从1开始数数,当遇到7或者7的倍数或者含有数字7时,必须以敲桌子代替,报出的人输。
源代码:
def game_seven(n_players): player = 0 # 初始玩家设置为0 for i in range(1, 101): # 从1数到100 if '7' in str(i) or i % 7 == 0: # 检查数字是否含有7或者是7的倍数 print('玩家', player% n_players + 1, '敲桌子') # 玩家敲桌子 else: print('玩家',player% n_players + 1, '报数', i) # 玩家报数 player += 1 # 下一个玩家 # 可以通过改变参数,设定玩家的数量 game_seven(5)
运行效果:
3.如果将20元换成零钱,要求只能换成1元、5元、10元的纸币,共有多少种方法。
源代码:
def count_change_ways(n): # 初始化一个数组来存储每个金额的方法数 ways = [0] * (n + 1) ways[0] = 1 # 金额为0时只有一种方法,即不换任何纸币 # 遍历每种纸币的面额 for coin in [1, 5, 10]: for amount in range(coin, n + 1): # 对于每个金额,加上使用当前纸币的方法数 ways[amount] += ways[amount - coin] return ways[n] # 计算将20元换成1元、5元、10元纸币的方法数 print(count_change_ways(20))
运行效果:
4.编程计算自然对数e的近似值,要求其误差小于0.00001,公式为e=1+1/1!+1/2!+1/3!+…+1/n!+…。
源代码:
def factorial(n): """计算阶乘""" result = 1 for i in range(2, n + 1): result *= i return result def approximate_e(error_threshold): """计算自然对数e的近似值""" e_approx = 1 n = 1 term = 1 while term >= error_threshold: term = 1 / factorial(n) e_approx += term n += 1 return e_approx # 设置误差阈值为0.00001 error_threshold = 0.00001 # 计算自然对数e的近似值 e_approx = approximate_e(error_threshold) print("自然对数e的近似值为:", e_approx)
运行效果:
5.编程找出1000以内的所有完数,一个数如果恰好等于它的因子之和,这个数称为完数,例如6=1+2+3。
源代码:
def find_factors(num): """找出一个数的所有因子(不包括该数本身)""" factors = [1] # 1是所有正整数的因子 for i in range(2, int(num ** 0.5) + 1): if num % i == 0: factors.append(i) if i != num // i: # 排除平方根的重复因子 factors.append(num // i) return factors def find_perfect_numbers(limit): """找出limit以内的所有完数""" perfect_numbers = [] for num in range(2, limit): factors = find_factors(num) if sum(factors) == num: perfect_numbers.append(num) return perfect_numbers # 找出1000以内的所有完数 perfect_numbers = find_perfect_numbers(1000) print("1000以内的所有完数:", perfect_numbers)
运行效果:
五、总结:
1.实验过程中的问题及解决方法:
问题:计算量大,导致程序运行缓慢。
解决方法:优化算法,例如使用更高效的算法,或者通过剪枝、缓存中间结果等技术减少重复计算。
问题:计算过程中出现数值不稳定,导致结果不准确或溢出。
解决方法:使用数值稳定的算法,或者调整计算顺序,避免大数吃小数的情况。
问题:程序占用内存过多,可能导致内存溢出。
解决方法:优化数据结构,减少不必要的内存占用,或者使用更高效的数据存储方式。
问题:程序在某些边界条件或异常情况下表现不佳。
解决方法:增加测试用例,特别是针对边界条件和异常情况的测试。
2.实验收获:
通过实验过程所获得的知识、技能、经验和洞察力。这些收获可以是理论上的,也可以是实践上的,或者是两者的结合,遇到问题是很常见的。关键是要有一个系统的方法来诊断问题,并采取适当的措施来解决它们。这通常涉及到代码审查、调试、性能分析和测试。通过这些方法,可以逐步提高程序的正确性、效率和稳定性。
📝大佬觉得本文有所裨益,不妨轻点一下👍给予鼓励吧!
❤️❤️❤️本人虽努力,但能力尚浅,若有不足之处,恳请各位大佬不吝赐教,您的批评指正将是我进步的动力!😊😊😊
💖💖💖若您认为此篇文章对您有所帮助,烦请点赞👍并收藏🌟,您的支持是我前行的最大动力!
🚀🚀🚀任务在默默中完成,价值在悄然间提升。让我们携手共进,一起加油,迎接更美好的未来!🌈🌈🌈