本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前n项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。 输入格式: 输入在一行中给出一个正整数n。 输出格式: 在一行中输出部分和的值,精确到小数点后两位。题目保证计算结果不超过双精度范围。 输入样例: 20 输出样例: 32.66
时间: 2023-05-31 09:18:09 浏览: 132
### 回答1:
以下是Python3代码实现:
n = int(input())
numerator = 2 # 分子
denominator = 1 # 分母
sum = 0 # 部分和
for i in range(n):
sum += numerator / denominator
numerator, denominator = numerator + denominator, numerator
print("{:.2f}".format(sum)) # 输出结果,保留两位小数
### 回答2:
题目分析:
题目中给出的数列可以表示为:
2/1, 3/2, 5/3, 8/5, 13/8, ...
可以发现,分子是一个斐波那契数列,分母是一个比分子序列少1位的斐波那契数列,根据这个规律可以得到程序的设计思路:
1. 用一个数组存储分子的斐波那契数列,初始化为2和3。
2. 用另一个数组存储分母的斐波那契数列,初始化为1和2。
3. 对于第i个数,计算分子数组的第i项为分子数组的第i-1项加上分母数组的第i-1项,分母数组的第i项为分子数组的第i-1项。
4. 将所有数列的前n项加起来,就是题目要求的部分和。
代码实现:
C++ 代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 100010;
double num[MAXN], den[MAXN];
int main()
{
num[1] = 2, num[2] = 3; // 初始化分子数组
den[1] = 1, den[2] = 2; // 初始化分母数组
int n;
cin >> n;
for (int i = 3; i <= n; i++) // 计算前n项
{
num[i] = num[i - 1] + den[i - 1];
den[i] = num[i - 1];
}
double sum = 0;
for (int i = 2; i <= n; i++) // 计算部分和
{
sum += num[i] / den[i];
}
printf("%.2lf", sum); // 输出结果,注意保留小数点后两位
return 0;
}
Python3 代码如下:
num, den = [2, 3], [1, 2] # 初始化分子分母数组
n = int(input())
for i in range(3, n + 1): # 计算前n项
num.append(num[i - 2] + den[i - 2])
den.append(num[i - 2])
print("%.2f" % sum(num[1:n + 1]) / sum(den[1:n + 1])) # 输出结果,注意保留小数点后两位
### 回答3:
首先,我们可以把序列中的每一项求出来,然后再相加得到部分和。由于每一项的分母都是前一项的分子,而每一项的分子是前一项分子与分母的和,因此我们可以利用两个变量prev(表示前一项分子)和curr(表示当前项分子)计算分子,再根据分子计算分母。具体来说,我们可以先初始化prev为1,curr为2,然后从第2项开始循环,每次将prev和curr更新为prev+curr和curr,以此计算当前项的分子与分母,并更新prev和curr。最后将每一项的值相加得到序列的部分和。
代码如下:
```python
n = int(input()) # 输入n
prev, curr = 1, 2 # 初始化第一项和第二项的分子和分母
sum = curr / prev # 初始化部分和为第二项的值
for i in range(2, n+1):
temp = curr # 临时保存当前项的分子
curr = prev + curr # 计算当前项的分子
prev = temp # 更新前一项的分子为当前项的分子
sum += curr / prev # 将当前项的值加入部分和
print('%.2f' % sum) # 输出部分和,保留两位小数
```
这样,我们就可以通过简单的迭代计算得到序列的部分和了。时间复杂度为$O(n)$,可以满足题目要求的计算效率。