C语言求Sn=1!+2!+3!+4!+5!+…+n!之值

这是我编的程序,但是当n=20时结果不对,结果应为2561327494111820313。求大神指教!
#include<stdio.h>
int main()
{
int i, n;
double sum = 0, f = 1;
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
f *= i;
sum += f;
}
printf("%.0f\n",sum);
return 0;
}

应该是类型的问题,改为int型就可以了

#include<stdio.h>
int main()
{
   int i, n;
   int sum = 0, f = 1;
   scanf("%d", &n);
   for(i = 1; i <= n; i++)
   {
       f *= i;
       sum += f;
   }
   printf("%d\n",sum);
   return 0;
}

追问

int不行,用long int 或 __int64可以。

追答

我电脑上我看了过程,long long 型都还会溢出

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-22
数值范围超大,可以使用64位整数处理:
#include<stdio.h>

int main()
{
int i,n=20;
__int64 sum=0, f=1;
for (i=1;i<=n;i++) {
f *=i;
sum += f;
}
printf("%lld\n", sum);
return 0;
}
注:这是gcc的写法,不同编译器,可能写法不一样:printf("%l64d\n", sum);追问

用__int64是对的,能解释一下__int64这个数据类型吗? 谢谢!

追答

现在的CPU基本上都是64的了,以前32位CPU时代,整数上限是2的32次方,
而64CPU则是2的64次方,
为了兼容以前的代码,所以现在的int仍然表示2的32次方,对64位int型数据,则增加了新的数据类型__int64,没什么特殊的,只要记住就可以。

现在的 int类型也可以写作:__int32,即32位整数

本回答被提问者和网友采纳
第2个回答  2014-11-22
printf("%.0f\n",sum);这一句中的"%0.f\n”中的f应该是float吧?而你要输出的是个double,double转成float肯定是被截断了,所以到20以后就不正确了。
第3个回答  2014-11-22
数据溢出。。。。。。。。。追问

我用的是double啊

第4个回答  2014-11-22
用long int追问

用long int n=20时,结果为268040729。但是,通过OJ提交答案是对的。请问这是为什么?

追答

因为 double 位数没有 long int 多 望采纳

相似回答