C语言:求数列:1-1/2+2/3-3/5+5/8-……+的前n项和,结果保留3位小数?

如题所述

#include <stdio.h>

int main()

{

int n, i;

float sum = 0, a = 1, b = 2, temp;

printf("请输入要求的项数n:");

scanf("%d", &n);

for(i = 1; i <= n; i++)

{

sum += a / b;

temp = a;

a = b - a; // 先交换a, b再更新b

b = temp + b;

}

printf("1-1/2+2/3-3/5+5/8-……前%d项和为%.3f\n", n, sum);

return 0;

}

在这段代码中,我们先输入要求的项数n,并初始化sum、a、b、temp四个变量。之后使用for循环计算前n项和,每一次循环都先将当前a/b加到sum上,并利用temp来暂存a的值,然后通过相减和交换a、b来更新a和b的值。最终输出结果即可。

需要注意的是,本题所求的数列是一个著名的斐波那契(Fibonacci)型数列,其中每个元素等于前两个元素的和,因此我们可以通过交换a和b的值实现计算。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2023-05-09
可以按照题目描述,采用循环的方法来依次计算每一项并累加求和。根据题目中给出的数列规律,可以把它们分成两个部分,分别为正数项和负数项,可分别计算它们的和。

根据数列规律,第 n 项的值可以通过前一项来计算,因此可以使用一个变量来保存前一项的值,并在计算当前项时使用。

以下是一种可能的实现方式:

```c
#include <stdio.h>

int main() {
int n;
float sum = 0, last = 1, cur; // last 保存上一项的值
scanf("%d", &n); // 输入项数
for (int i = 1; i <= n; i++) {
if (i % 2 == 1) { // 正数项
cur = last;
} else { // 负数项
cur = -last;
}
sum += cur;
last = (i * 2 - 1) * 1.0 / (i * 2) * last; // 更新上一项的值
}
printf("%.3f", sum); // 输出结果,保留三位小数
return 0;
}
```

上述代码中,使用变量 `last` 来保存上一项的值,计算当前项时根据正负号进行判断,并使用循环来依次计算每一项并累加求和。在计算每一项时,还需要用当前项的值来更新 `last` 的值。最后输出结果即可。

需要注意的是,在计算每一项时要进行类型转换,以避免因运算顺序导致的错误。另外,使用浮点数来保存结果,以便输出保留三位小数的格式化结果。
相似回答