题目:求 的值。
思路:循环n次,每次求每一项的值,并加起来,求每一项的值需要求阶乘,而阶乘的时间复杂度为O(n),所有总的时间复杂度为O(n^2)。所以这个方法不好。
优化:求每一项的值不需要求阶乘。第一项1/1!,第2项1/3!,第3项1/5!。可以发现,第i项等于前一项除以(2i-1)(2i-2)。
#include<iostream>
using namespace std;
int main(){
int n=10;
double sum=1;//和
double temp=1;//每一项的绝对值
int sign=-1;//每一项的正负号
for(int i=2;i<=n;i++){
temp=temp/((2*i-1)*(2*i-2));//后面一项的绝对值是前一项除以(2i-1)(2i-2)
sum+=sign*temp;
sign=-sign;
}
//0.841471
cout<<sum<<endl;
return 0;
}
以上算法的时间复杂度为O(n)。当n=10时,答案如下: