打印1+x+x2/2时,x=2和n=4处出现逻辑错误!+x3/3!+…n项

  • 本文关键字:错误 +x3 4处 2时 1+x+x2 打印 c++
  • 更新时间 :
  • 英文 :


限制:

  • 不能使用阶乘函数
  • 不能使用while/do-while循环

目标:打印1+x+x2/2!+x3/3!+…n术语

问题:在x=2和n=4输入时,输出为5.6667,应为6.3333

  • n=0,1,2,3的输出正确
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
float x, n, sum = 0;
cout << "ENTER x: ";
cin >> x;
cout << "ENTER n: ";
cin >> n;
for (int i = 0, fac = 1; i < n; i++)
{
for (int j = 1; j <= i; j++)
fac *= j;
sum += pow(x, i) / fac;
}
cout << sum;
return 0;
}

您所要做的就是将fac = 1;放在第二个循环之前,然后您的代码就会给出正确的答案。此外,n应该是int,而不是float

更正代码:

在线试用!

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
float x, sum = 0;
cout << "ENTER x: ";
cin >> x;
cout << "ENTER n: ";
cin >> n;
for (int i = 0, fac = 1; i < n; i++)
{
fac = 1;
for (int j = 1; j <= i; j++)
fac *= j;
sum += pow(x, i) / fac;
}
cout << sum;
return 0;
}

输入:

2 4

输出:

6.33333

另外,不要忘记,n的阶乘越大,int就会溢出,所以最好让fac变量浮动或加倍,也就是说,不要让int fac;double fac;,这足以克服溢出。

很明显,通过引入每项计算的递归公式,而不是在每次迭代中计算完整的pow()和Factorial,可以使计算速度更快。

我的递归公式优化代码版本如下:

在线试用!

#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
float x, term = 1, sum = 0;
cout << "ENTER x: ";
cin >> x;
cout << "ENTER n: ";
cin >> n;
if (n >= 1)
sum = 1;
for (int i = 1; i < n; ++i) {
term *= x / i;
sum += term;
}
cout << sum;
return 0;
}

输入:

2 4

输出:

6.33333

最新更新