限制:
- 不能使用阶乘函数
- 不能使用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