问题描述
分数序列求和问题通常指计算一个特定规律的分数序列前N项之和。常见的分数序列形式为:2/1, 3/2, 5/3, 8/5, 13/8...,即每一项的分子是前一项分子与分母之和,分母是前一项的分子。此类问题考察循环结构、变量更新和浮点数运算。
解题思路
观察分数序列的规律,分子和分母的更新遵循斐波那契数列的特性。初始化前两项的分子和分母,通过循环依次计算每一项的值并累加。注意使用浮点数类型存储中间结果以避免整数除法丢失精度。
代码实现
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
int N;
cin >> N; // 输入项数
double sum = 0.0;
double numerator = 2.0, denominator = 1.0;
for (int i = 1; i <= N; ++i) {
sum += numerator / denominator;
double next_numerator = numerator + denominator;
double next_denominator = numerator;
numerator = next_numerator;
denominator = next_denominator;
}
cout << fixed << setprecision(4) << sum << endl;
return 0;
}
关键点分析
- 变量初始化 :分子初始值为2,分母初始值为1,和
sum初始化为0。 - 循环更新 :每次循环计算当前项的值并累加到
sum,随后更新分子和分母为下一项的值。 - 输出精度 :使用
fixed和setprecision(4)控制输出保留4位小数。
示例输入输出
输入:
20
输出:
32.6603
复杂度分析
- 时间复杂度:O(N),只需一次循环遍历前N项。
- 空间复杂度:O(1),仅使用常数级别的额外空间。
扩展思考
若分数序列的规律不同(如分子分母为等差数列),需调整更新逻辑。例如,分子为1, 3, 5...,分母为2, 4, 6...,则循环内更新规则应改为:
numerator += 2;
denominator += 2;