所在位置:主页 > 程序语言 > c语言求阶乘的函数

c语言求阶乘的函数

发布时间:2023-12-09 16:54来源:www.sf1369.com作者:宇宇

c语言求阶乘的函数

阶乘:

阶乘是基斯顿·卡曼(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;

}

C语言怎么求大数的阶乘?

C语言利用数组计算超大整数的阶乘代码

#include <stdio.h>    

int main()    

{    

    int n;    

    int a[9000]; //确保保存最终运算结果的数组足够大    

     int digit = 1; //位数    

     int temp;   //阶乘的任一元素与临时结果的某位的乘积结果    

     int i, j, carry; //carry:进位    

     printf(please in put n:\n);    

    scanf(%d,&n);    

    a[0] = 1;   //将结果先初始化为1    

    for ( i=2; i<=n; i++ )  //开始阶乘,阶乘元素从2开始依次登场    

    {  //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘    

         for( j=1, carry=0;  j<=digit; j++ )    

        {    

            temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)    

              a[j-1] = temp % 10; //更新临时结果的位上信息    

              carry = temp / 10; //看是否有进位    

         }    

        while(carry)    

        {    //如果有进位    

              a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1    

            carry = carry / 10; //看还能不能进位    

         }    

    }    

    printf(n ! = );    //显示结果    

    for(j = digit; j >=1;j--)    

    {    

        printf(%d,a[j-1]);    

    }    

    printf(\n);    

    return 0;    

}    

#include <stdio.h>    

int main()    

{    

    int n;    

    int a[9000]; //确保保存最终运算结果的数组足够大    

     int digit = 1; //位数    

     int temp;   //阶乘的任一元素与临时结果的某位的乘积结果    

     int i, j, carry; //carry:进位    

     printf(please in put n:\n);    

    scanf(%d,&n);    

    a[0] = 1;   //将结果先初始化为1    

    for ( i=2; i<=n; i++ )  //开始阶乘,阶乘元素从2开始依次登场    

    {  //按最基本的乘法运算思想来考虑,将临时结果的每位与阶乘元素相乘    

         for( j=1, carry=0;  j<=digit; j++ )    

        {    

            temp = a[j-1] * i + carry; //相应阶乘中的一项与当前所得临时结果的某位相乘(加上进位)    

              a[j-1] = temp % 10; //更新临时结果的位上信息    

              carry = temp / 10; //看是否有进位    

         }    

        while(carry)    

        {    //如果有进位    

              a[++digit-1] = carry % 10; //新加一位,添加信息。位数增1    

            carry = carry / 10; //看还能不能进位    

         }    

    }    

    printf(n ! = );    //显示结果    

    for(j = digit; j >=1;j--)    

    {    

        printf(%d,a[j-1]);    

    }    

    printf(\n);    

    return 0;    

}