【GESP】C++一级练习 luogu-B2069, 求分数序列和
一级练习,难度提升了一些。根据规律,构造数列计算。
luogu-B2069
题目要求
描述
有一个分数序列 $\frac{q_1}{p_1}, \frac{q_2}{p_2}, \frac{q_3}{p_3}, \frac{q_4}{p_4}, \frac{q_5}{p_5}, …$,其中 $q_{i+1} = q_i + p_i, p_{i+1} = q_i, p_1 = 1, q_1 = 2$。比如这个序列前 $6$ 项分别是 $\frac{2}{1}, \frac{3}{2}, \frac{5}{3}, \frac{8}{5}, \frac{13}{8}, \frac{21}{13}$。求这个分数序列的前 $n$ 项之和。
输入
输入一行一个正整数 $n$,其中 $n \le 30$。
输出
输出一行一个浮点数,表示分数序列前 $n$ 项的和,精确到小数点后 $4$ 位。
输入样例-1
2
输出样例-1
3.5000
题目分析
- 读取项数$n$的值
- 初始化分母$m$为1,分子$z$为2,和$sum$为0
- 在每次循环中,计算当前项的值并累加到$sum$
- 根据题目中给出的分子和分母的排列关系,更新下一个分子和分母的值
- 输出和$sum$,保留到小数点后4位
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <cstdio> // 包含输入输出流头文件
int main() {
int n; // 定义整数n,用于存储输入的项数
scanf("%d", &n); // 从输入流中读取n的值
int m = 1; // 初始化分子母1
int z = 2; // 初始化分子为2
double sum = 0; // 初始化和为0
for (int i = 1; i <= n; i++) { // 循环n次,计算前n项的和
sum += (double)z / m; // 计算当前项的值并累加到sum
int temp = z; // 保存当前分子的值
z = m + z; // 更新下一个分子为当前分子加上当前分母
m = temp; // 更新下一个分母为当前分子
}
printf("%.4f", sum); // 输出和,保留到小数点后4位
return 0; // 返回0,表示程序执行成功
}
其实,在孩子最开始做的时候,我没有注意到题目中给出的分子、分母的排列规律,我教孩子按照分子、分母各自成为一个斐波那契数列的方式计算,得出的结果。复杂度显然提升了很多,代码参考如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <cstdio>
int main() {
int n;
scanf("%d", &n);
int a1 = 1;
int a2 = 2;
int b1, b2;
b1 = 2;
b2 = 3;
double m;
double z;
double sum = 0;
double s1 = (double)b1 / (double)a1;
double s2 = (double)b2 / (double)a2 + s1;
if (n == 1) {
printf("%.4f", s1);
} else if (n == 2) {
printf("%.4f", s2);
} else {
for (int i = 3; i <= n; i++) {
m = a2 + a1;
a1 = a2;
a2 = m;
z = b2 + b1;
b1 = b2;
b2 = z;
sum += (double)z / m;
}
printf("%.4f", sum + s2);
}
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
本文由作者按照 CC BY 4.0 进行授权