C语言求1到20阶乘的和,出来的是负数

代码如下
#include<stdio.h>
main()
{
long double s=-1,i,n,t=1;
for(n=1;n<=20;n++)
{ s=s+t;
i=n;
for(t=1;i>0;i--)
t=t*i;
}
printf("1!+2!+3!+...+20!=%d\n",s);
return 0;
}

long double 改为 double,

%d 改为 %lf 

#include <stdio.h>

int main()
{
  double s = 0, t = 1, n;
  for (n = 1; n <= 20; n++)
  {
    t *= n;
    s += t;
  }
  printf("1!+2!+3!+...+20! = %.0lf\n",s);
  return 0;
}
// 输出:1!+2!+3!+...+20! = 2561327494111820288

 另外,你的程序求的是 19!。

追问

为什么要改为double?long double不是包括double吗?
整数为什么要用浮点%lf
for那里是n<=20 应该算的是20!吧

还有t*=t是什么意思

追答

用 double 就够了。

如果要用 long double,也是可以的,但格式符要改为 %Lf。

你的程序算完 n = 20 后, t 是 20!,但没有加到 s 上,只加到 19!,你仔细分析一下就会明白。

输出浮点型变量要用 %f 格式符,哪怕它的小数点后面全为0。

t *= n 就是 t = t * n 的意思;
s += t 就是 s = s + t 的意思。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-31
溢出整数范围而已。
long double 改为long long,最后printf用llf ,别问为什么,我也不知道,程序硬性要求,int用%d,long用ld,long long 用lld
输出控制符,你们老师应该讲过的。
第2个回答  2013-10-31
printf("1!+2!+3!+...+20!=%d\n",s);

改成
printf("1!+2!+3!+...+20!=%.0lf\n",s);

double输出的时候不是%d 是 lf
相似回答