C语言求阶乘问题

题目描述
求n!,其中,n为用户输入的任何整数。(n<=50,具体值由用户输入)
输入
任意输入一个整数(不超过50)
输出
该数的阶乘
样例输入
5

样例输出
120

我的程序到17以上就无法输出了,应该怎么解决?附上源程序

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

这个是大数阶乘的问题
int(假设4字节、32位)的存储范围为 [-2147483648,2147483647],
而17!是355687428096000,超出了int 的存储范围,所以出错了
要解决类似的阶乘问题,需要用一个数组在存放计算结果的不同位,比如定义一个array数组
array的每一个元素存放结果的5位,数组初始化时,只有最低的元素是1,其他是0;计算s=s*i的时候把i和数组中的每一个元素相乘,结果该进位的进位并求余,这样就可以得到50!了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-10-31
long类型也无法解决,超出了所在的类型。17!太大了吧。追问

那应该怎么解决呢?要求最大能输出到50!

追答

#include
int main()
{
int a,i;
double s;
s=1;
scanf("%d",&a);
for (i=1;i<=a;i++)
s=s*i;
printf("%.lf\n",s);
return 0;
}
用double类型吧。你直接复制看看答案。

本回答被提问者采纳
第2个回答  2014-10-31
把int 改成long型;
#include<stdio.h>
main()
{
int a,i;long s=1;
scanf("%ld",&a);
for (i=1;i<=a;i++)
s=s*i;
printf("%ld\n",s);
}追问

输入17的时候还是输出了一个负数,输入50就变成了0了。并且50!应该没有超出int所能表示的最大值范围啊

追答

额。50!=3.0414093201713378043612608166065e+64,而int 所能表示的数只有2^32=4294967296所以,已经没办法了表示了。而17!=355687428096000也已经远远大于int所能表示的数了好吧。

第3个回答  2014-10-31
你或许应该去搜搜高精度

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网