设计一个过程(函数或子程序):计算n!=1×2×3×…×n.用C语言主调函数过程调用这个过程并完成下列任务:

(1)计算s=20!;
(2)计算t=26!;
(3)计算k=t/s

这个问题直接用变量来算是错误的,整形或者长整形没有这么大,26的阶乘有27位数字,用double虽然能存下,但是损失了精度,后面的数字是不准确的,double虽然上限是10的308次方,但是有效地数字位数只有14-15位的样子,也就是用类似科学计数法来保存的,数字不准确。这个只能用数组自己一位一位地算。下面是例子代码。

#include <stdio.h>
char* CalcFact(int n)
{
int a[100]; //确保保存最终运算结果的数组足够大,26的阶乘有27位,这里至少要比最大结果再多1位

longint digit = 1; //结果的位数
longint temp; //阶乘的任一元素与临时结果的某位的乘积结果
longint i,j,carry; //i:1~n的某一阶乘元素;carry:进位
a[0] = 1; //将结果先初始化为1
for(i = 2; i <= n; i++)
{ //开始阶乘,阶乘元素从2开始依次"登场"
//按最基本的乘法运算思想来考虑,将阶乘元素i与临时结果的每位a[j-1]相乘
for( j = 0, carry = 0; j < digit; j++)
{
temp = i * a[j] + carry; //相应阶乘中的一项i与当前所得临时结果的从低到高各位a[j-1]依次相乘(加上进位)
a[j] = temp % 10; //更新临时结果的位上信息
carry = temp / 10; //更新相乘后的进位
}
while(carry) //如果有进位
{
++digit; //新加一位,添加信息。位数增1
a[digit-1] = carry % 10; //将进位放在新加的结果位上
carry = carry/10; //看还能不能进位
}
char myFact[digit+1];
temp=0;
for(j = digit; j >=1;j--)
{
myFact[temp]=a[j]+48; //+48把数字变成字符,‘0’=48,以此类推
temp++;

}
myFact[temp]='\0';
return myFact;
}

void main()
{
printf (“26!=%s”, CalcFact(26));
printf (“20!=%s”, CalcFact(20));
}追问

谢谢你的详细解答,不过我是刚学的C语言,不能理解你的程序,能写个简单的嘛,谢谢。

追答

如果需要精确的答案,这个已经很简单了,没办法更简单了。
如果只需要大概的答案,就很简单,直接用double变量乘就可以了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-05-01
阶乘函数

int Factorial(n)
{
int nResult = 1;
while(n)
{
nResult *=n--;
}
return nResult;
}
第2个回答  2013-05-01
你得自己编写一个函数,然后在main中调此函数完成计算追问

我不会写,写过之后,我输入一个值,就会出现包括这个值以前的所有的值的阶乘都出现,我也不知道错在哪里?你能帮我写个程序吗?

追答

#include
void main()
{
int s,t;
double d;
scanf("%d",&s);
scanf("%d",&t);
d=fun(s)/fun(t);
printf("%d %d %d\n",s,t,d);

}

double fun(int n)
{
double d=1.0;
for(i=1;i<=n;i++)
{
d=d*i;
}
return d;
}

可以试试这个!自己变动一下吧!

追问

这个程序存在很多错,不过还是很谢谢你的回答

第3个回答  2013-05-01
递归
第4个回答  2018-06-21
#include<stdio.h>
void main()
{
unsigned long jc(int n);
unsigned long jg;
jg=jc(20);
printf("%ul\n",jg);
}
unsigned long jc(int n)
{
int i;
unsigned long f=1;
for(i=1;i<=n;i++)
f*=i;
return f;
}
相似回答