关于c语言的题“求S=1/1!+1/2!+1/3!+…+1/N!”我知道算法但是我的结果最后一位与标准答案不一样,求大神

原题是求S=1/1!+1/2!+1/3!+…+1/N!并输出结果(显示时小数部分占16位,计算时要求从第1项开始往后累加)。N为任意自然数(只考虑int型)标准答案输入1... 原题是 求S=1/1!+1/2!+1/3!+…+1/N!并输出结果(显示时小数部分占16位,计算时要求从第1项开始往后累加)。N为任意自然数(只考虑int型) 标准答案 输入18 得到的是1.7182818284590455,而我的答案是1.7182818284590451;
#include <stdio.h>

int main(void)
{
int nn, ii, zz;
double sum = 0;
float kk = 1;

printf("Please input n: ");
scanf ("%d", &nn);
zz = nn;
for (nn = nn; nn >= 1; nn--)
{
for (ii = 1; ii <= nn; ii++)
{
kk = kk * ii;

}
//printf("\n%lf", kk);
sum = 1 / kk + sum;
//printf("\n%.16lf", sum);
kk = 1;
}
printf("\nS=1/1!+1/2!+...+1/%d!=%.16lf\n", zz, sum);
return 0;
}
有两个斜杠的解释语句是我当时检查是用的 大家可以忽略。。。。。本人初学者 求大神赐教
展开
 我来答
犬虫门心西安
2014-04-04 · TA获得超过163个赞
知道小有建树答主
回答量:124
采纳率:0%
帮助的人:109万
展开全部
你的程序没有问题,结果也没有问题。是因为double类型的有效位数是15位,到了第16位及后面的数字,就没有意义了。这里要涉及截断误差和积累误差。二进制无法精确表示某些十进制小数,而计算机内存容量又是有限的,所以在表示十进制数值时,必然会因为参与表达数值小数部分的二进制位数有限而产生误差。而这个误差又在计算中不断放大,所以能有这么一点误差已经很不错了!不要以为大学是高中考试,必须有标准答案。
laughlee7468
2014-04-04 · TA获得超过2004个赞
知道小有建树答主
回答量:541
采纳率:100%
帮助的人:674万
展开全部
你的程序如果如下改改将可能会更好,因为这样它将更简洁,更容易看懂,也更快。
#include <stdio.h>

int main( )
{
int i, n;
double sum = 0, t = 1;
scanf("%d", &n)
for(i = 1; i <= n; i++)
{
t = t / i;
sum = sum + t;
}
printf("\nS=1/1!+1/2!+...+1/%d!=%.16lf\n", n, sum);
return 0;
}
更多追问追答
追答

你之前的程序从正确性方面来讲,是正确的。从程序的质量来说(算法选择不恰当),不是很好的。

运行结果

追问
不过为什么我的运行出来最后一位会不一样啊  
我也用是double 来定义我的变量啊。能具体解释分析一下吗
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cdyzxy
2014-04-04 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.4万
采纳率:85%
帮助的人:3701万
展开全部
long long int nn,ii,zz;
double sum =0,kk;
nn=ii=1;
do
{ kk=(double)1/ii; sum+=kk; nn++; ii*=nn;
} while ( kk>= 1e-17 );
printf("\nS=1/1!+1/2!+...+1/%lld!=%.16lf\n",nn,sum);
这题需要采用精度做为结束条件,并且考虑到阶乘得数是否会导致整型数据溢出。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式