给定一个正整数,计算1-1/2+1/4-1/8+1/16……的前n项之和。 输入要求 输入一个正整数n。 输出要求 输出前n项之和,保留2位小数。
时间: 2024-03-30 08:25:21 浏览: 105
算法1:暴力枚举
按照题目要求模拟计算即可。
时间复杂度:$O(n)$
C++ 代码
class Solution {
public:
double calculate(int n) {
double sum = 1.0;
double part = 1.0;
for(int i=2;i<=n;i++){
part = part / 2;
sum = sum + part;
}
return sum;
}
};
算法2:数学公式
根据等比数列的求和公式,$\sum\limits_{i=0}^{n}a^i=\frac{1-a^{n+1}}{1-a}$。
因此,原式可以写成$1-\frac{1}{2}+\frac{1}{4}-\frac{1}{8}+\frac{1}{16}-\frac{1}{32}+...=\sum\limits_{i=0}^{\infty}(-\frac{1}{2})^i=\frac{1}{1-(-\frac{1}{2})}=\frac{2}{3}$。
时间复杂度:$O(1)$
C++ 代码
class Solution {
public:
double calculate(int n) {
return 2.0 / 3.0;
}
};
相关问题
给定一个正整数,计算1-1/2+1/4-1/8+1/16……的前n项之和。
这个数列是一个等比数列,每项为前一项的一半,公比为1/2。所以根据等比数列求和公式:
S = a(1 - q^n) / (1 - q)
其中,a为首项,q为公比。对于这个数列,首项a=1,公比q=1/2。代入公式,得到:
S = 1 - 1/2^n
所以,1-1/2 1/4-1/8 1/16……的前n项之和为1-1/2^n。
用C语言给定一个正整数,计算1-1/2+1/4-1/8+1/16……的前n项之和。
以下是用 C 语言实现计算的代码:
```c
#include <stdio.h>
int main() {
int n;
double sum = 0.0;
printf("请输入项数n:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
double item = 1.0 / (1 << i);
if (i % 2 == 0) {
sum += item;
} else {
sum -= item;
}
}
printf("前%d项之和为%f\n", n, sum);
return 0;
}
```
程序首先提示用户输入要计算的项数 `n`,然后使用一个循环计算每一项的值,并根据奇偶性累加或累减到总和 `sum` 中。最后输出结果。
需要注意的是,本题中分母中的 2 是 2 的整数次幂,所以可以用位运算来代替除法,提高计算效率。
阅读全文