请大家帮忙看下这道简单的C++题目

来源:百度知道 编辑:UC知道 时间:2024/05/11 01:07:41
题目要求求1!+2!+3!+……+20!的值
这是我写的程序:
#include <iostream>
using namespace std;
int main ()
{
float n=1,sum=0;

while (n<=20)
{
int i=1,t=1;
while (i<=n)
{

t=t*i;
i++;
}
sum=sum+t;
n++;
}
cout<<"Sum="<<sum<<endl;
return 0;
}

可以运行,但是答案不对,哪里需要修改啊?
我看了标准答案,也看得懂啊,我觉得我的也是对的啊,晕啊,我是自学的,没有老师,所以请大家帮忙啊!

这是标准答案:
#include <iostream>
using namespace std;
int main ()
{float s=0,t=1;
int n;
for (n=1;n<=20;n++)
{
t=t*n; // 求n!
s=s+t; // 将各项累加
}
cout<<"1!+2!+...+20!="<<s<<endl;
return 0;
}

#include <iostream>
using namespace std;
int main ()
{
float n=1,sum=0;

while (n<=20)
{
int i=1;
float t=1;
while (i<=n)
{

t=t*i;
i++;
}
sum=sum+t;
n++;
}
cout<<"Sum="<<sum<<endl;
return 0;
}
上面的程序可以出正确结果,在你的基础上改的。
你的原因是t的溢出。int i=1,t=1;
t最大4294967296-1
把它改成float t=1;

#include <iostream>
using namespace std;
int main ()
{
float n=1,sum=0,t=1;//t会溢出
int i=1;
while (n<=20)
{
t=i=1;
while (i<=n)
{

t=t*i;
i++;
}
sum=sum+t;
n++;
}
cout<<"Sum="<<sum<<endl;
return 0;
}

你的程序数据已经溢出。那个t的值运行到10!以上的时候差不多溢出了,变成负数,导致结果不正确。如何修改?自已应该会改吧。

把float改成int就可以了

你的写错了,把t定义成float型。不然会丢失精度的。最后累加就发现小了很多。其实你的算法没有错,但是效率太低了。