PTA-Python题目 第2章-5 求奇数分之一序列前N项和

该博客介绍了如何使用Python计算序列1 + 1/3 + 1/5 + ...的前N项和。通过输入一个正整数N,程序将输出精确到小数点后6位的和。博主推荐使用列表推导式来实现,认为这种方法更简洁高效。

简单易懂【PTA-Python题库】第2章-5 求奇数分之一序列前N项和

本题要求编写程序,计算序列 1 + 1/3 + 1/5 + … 的前N项之和。

输入格式:

输入在一行中给出一个正整数N。

输出格式:

在一行中按照“sum = S”的格式输出部分和的值S,精确到小数点后6位。题目保证计算结果不超过双精度范围。

输入样例:

23

输出样例:

sum = 2.549541

思路:

我用的是列表推导式,我之前看也有人用循环,但是个人感觉列表推导式更为简洁。

代码如下:

n = int(input())
a = sum(
<think> 根据用户需,我们需要编写一个程序来计算序列 1 + 1/2 + 1/3 + ... 的N。用户要输入一个正整数N,输出格式为“sum = S”,其中S是N,精确到小数点后6位。 我们参考了多个引用,其中引用[3][4][5]提供了C语言的实现,引用[2]提供了Python实现。由于用户没有指定语言,但根据问题上下文(如引用中出现的C语言Python),我们可以提供两种常见语言的实现。 ### 思路分析 1. **输入处理**:读取一个正整数N。 2. **初始化累加器**:设置一个变量(如sum)初始化为0.0,用于累加。 3. **循环计算**:从1循环到N(包括N),每次循环将1/i加到累加器中。注意:在除法中要确保使用浮点数运算,避免整数除法(例如,1.0/i而不是1/i)。 4. **输出结果**:按照指定格式输出,保留6位小数。 ### 代码实现 #### C语言版本 参考引用[3][4][5]的C语言代码: ```c #include <stdio.h> int main() { int N; double sum = 0.0; // 读取输入的整数N scanf("%d", &N); // 循环累加 for (int i = 1; i <= N; i++) { sum += 1.0 / i; // 使用1.0确保浮点除法 } // 输出结果,保留6位小数 printf("sum = %.6f\n", sum); return 0; } ``` #### Python版本 参考引用[2]的Python代码(稍作调整以满足题目): ```python n = int(input().strip()) # 读取一个正整数n s = 0.0 # 初始化累加 for i in range(1, n+1): # 从1到n s += 1.0 / i # 累加 print("sum = {:.6f}".format(s)) ``` ### 注意事 1. **浮点数精度**:使用浮点数进行累加,避免整数除法(在CPython中,整数除法会截断为整数,所以分子或分母至少有一个要是浮点数)。 2. **循环范围**:循环变量i从1开始,到N结束(包括N)。 3. **输出格式**:必须严格按照“sum = S”的格式,且S保留6位小数。 ### 示例运行 - 输入:`6` - 输出:`sum = 2.450000` ### 相关问题 1. 如果要计算序列1 + 1/3 + 1/5 + ...的N,程序应如何修改? 2. 在累加过程中,如何避免浮点精度损失(对于非常大的N)? 3. 除了循环累加,是否有其他更高效的方法计算调级数的部分? ### 引用 [^1]: 引用1描述了一个问题,但具体内容未提供,这里以用户提供的引用为准。 [^2]: 引用2提供了计算奇数分之一序列NPython代码。 [^3][^4][^5]: 引用3、4、5提供了C语言版本的实现。 以上代码说明应该能够满足用户的需。用户可以根据自己的编程语言选择相应的实现。 </think>### 计算 1 + 1/2 + 1/3 + ... N 的程序 以下是计算调级数 N 的完整实现方案,满足输入正整数 N,输出格式 `sum = S`(S 精确到小数点后 6 位)的要。 #### 算法思路 1. **读取输入**:获取用户输入的正整数 N 2. **初始化累加器**:设置变量 `sum = 0.0` 3. **循环累加**:使用循环从 1 到 N,每次加上 $1/i$ 4. **格式化输出**:输出结果保留 6 位小数 #### C 语言实现 ```c #include <stdio.h> int main() { int N; double sum = 0.0; // 读取输入 scanf("%d", &N); // 计算N: sum = 1 + 1/2 + 1/3 + ... + 1/N for (int i = 1; i <= N; i++) { sum += 1.0 / i; // 使用1.0确保浮点数除法 } // 输出结果(保留6位小数) printf("sum = %.6f\n", sum); return 0; } ``` #### Python 实现 ```python n = int(input().strip()) # 读取正整数N s = 0.0 # 循环累加: s = 1 + 1/2 + 1/3 + ... + 1/n for i in range(1, n + 1): s += 1.0 / i # 使用1.0确保浮点数除法 # 格式化输出结果 print(f"sum = {s:.6f}") ``` #### 关键说明 1. **浮点精度处理**:使用 `1.0/i` 而非 `1/i` 确保执行浮点数除法 2. **循环范围**:循环变量 i 从 1 开始,到 N 结束(包含 N) 3. **输出格式**:使用格式化输出保证 6 位小数精度 4. **时间复杂度**:$O(N)$ #### 示例运行 输入: ``` 6 ``` 输出: ``` sum = 2.450000 ``` ### 相关问题 1. 如何计算交错级数 $1 - \frac{1}{2} + \frac{1}{3} - \frac{1}{4} + \cdots$ 的 N 2. 当 N 很大时(如 $N > 10^6$),如何优化调级数的计算精度? 3. 能否用递归方法实现调级数的计算?递归迭代哪种更高效? 4. 如何计算调级数的部分公式 $H_N = \sum_{k=1}^N \frac{1}{k}$ 的近似值(使用对数)? > 引用说明:本文代码参考了PTA练习系统的标准解法[^3][^4][^5],并优化了浮点运算处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值