林俊杰 弹唱:c语言求阶乘的函数

来源:百度文库 编辑:高考问答 时间:2024/04/28 08:34:27
int fac(int n)
{static int f=1;
f=f*n;
return(f);
}
main()
{int i;
for(i=1;i<=5;i++)
printf("%d!=%d\n",i,fac(i));
}
fac()函数是实现求阶乘的,怎么实现的呢

f是fac()函数内部的静态变量,那么,f只在第一次进入fac()函数时才执行其初始化操作,以后都会跳过初始化操作。所以第一次执行fac(1)函数时,f初始化为1,并乘以1,f仍为1;第二次执行fac(2)时,跳过初始化操作,f=f*2,f为2;第三次执行fac(3)时,跳过初始化操作,f=f*3,f为6;第四次执行fac(4)时,跳过初始化操作,f=f*4,f为24;......以此类推。

由于f定义为静态(static)整数
每次执行fac时是不随fac的执行完毕清除的
所以可以累乘
i:1 f:1
i:2 f:1*2=2;
i:3 f:2*3=6
i:4 f:6*4=24
...

  阶乘:
  阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。
  一个正整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,并且有0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。
  亦即n!=1×2×3×...×n。阶乘亦可以递归方式定义:0!=1,n!=(n-1)!×n。
  

  C语言
  在 C 语言中,使用循环语句可以很方便的求出阶乘的值,下面介绍一个很简单的阶乘例子。(因为网上多数是比较麻烦的方法)
  【计算出“ 1!+ 2!+ 3!+ …… + 10!”的值是多少?】

  #include<stdio.h>
  int main()
  {
  int x;
  long j=1,sum=0;
  for(x=1;x<=10;x++)
  {
  j*=x;
  sum+=j;
  }
  printf("1!+2!+...+10!=%ld\n",sum);
  return 0;
  }
  

  /*结果:4037913*/
  Pascal中program test;
  varn:longint;
  function jc(n:longint):qword;
  begin if n=0 then jc:=1 else jc:=n*jc(n-1)end;
  begin readln (n); writeln (jc(n))end.
  C++ 中

  #include<iostream>
  using namespace std;
  long long f(int n)
  {
  long long e=1;
  if(n>0)
  e=n*f(n-1);
  cout<<n<<"!="<<e<<endl;
  return e;
  }
  int main()
  {
  int m=20;
  f(m);
  return 0;
  }
  

  以上使用 C++ 11 标准
  也可以利用积分求浮点数阶乘:

  #include<cstdio>
  #include<cmath>
  double s;
  const double e=exp(1.0);
  double F(double t)
  {
  return pow(t,s)*pow(e,-t);
  }
  double simpson(double a,double b)
  {
  double c=a+(b-a)/2;
  return (F(a)+4*F(c)+F(b))*(b-a)/6;
  }
  double asr(double a,double b,double eps,double A)
  {
  double c=a+(b-a)/2;
  double L=simpson(a,c),R=simpson(c,b);
  if(fabs(L+R-A)<=15*eps) return L+R+(L+R-A)/15.0;
  return asr(a,c,eps/2,L)+asr(c,b,eps/2,R);
  }
  double asr(double a,double b,double eps)
  {
  return asr(a,b,eps,simpson(a,b));
  }
  int main()
  {
  scanf("%lf",&s);
  printf("%lf\n",asr(0,1e2,1e-10));
  return 0;
  }
  
  

int fac(int n)
{
int rs=1;
while(n>1)
rs*=n--;
return rs;
}

二楼说的很清楚了,呵呵]