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

Python014

C语言怎么求大数的阶乘?,第1张

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=2i<=ni++ )  //开始阶乘,阶乘元素从2开始依次"登场"  

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

for( j=1, carry=0  j<=digitj++ )  

{  

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 = digitj >=1j--)  

{  

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 >=1j--)    

    {    

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

    }    

    printf("\n")    

    return 0    

}

对于求大整数的阶乘,可以采用分段相乘的方法,其理论基础是加法的分配律,乘法的分配律。

for

exmaple

:123456789*123=123*(123*10^5+56789)=123*123*10^5+123*56789;

如果我们用一个数组result[0]=56789,result[1]=123,那么123456789*123就是123*result[0]%10^6和result[1]*123+result[0]/10^6构成的一个数,另result[0]=123*result[0]%10^6,result[1]=result[1]*123+result[0]/10^6,则这个数就是result[1]result[0]

#include<stdio.h>

int

main()

{

int

n,j,i,t,p

int

result[16000]

while(scanf("%d",&n)!=EOF){

t=p=0result[0]=1

//t记录result中所存数的个数

for(j=1j<=nj++){

//n!=1*2*3*4...*n

for(i=0i<=ti++){

result[i]=result[i]*j+p

//如果sum>99999不成立,则不需进位,进位为0

p=result[i]/100000

//进位

result[i]%=100000

//数组sum中每位存5位数字

}

if(p){

//t在最高位有进位的情况下++,最高位存进位

,并让进位为0

t++

result[t]=p

p=0

}

//

如果进位不为0,

则下一次乘的时候将加上该进位,显然不合理

}

printf("%d",result[t])//先把最高位输出,因为最高位没有前导0

for(i=t-1i>=0i--)

printf("%05d",result[i])//s[i]不足5位,说明需补0

也说明result[i]在对100000取余的时候去掉了前导0,所以这里要加上

printf("\n")

}

return

0

}

刚才刚弄过一个,int数组每个元素保存四位数,10000以内的阶乘不会有问题

#include <stdio.h>

#define N 10000

int main()

{

static long int r[N]={1}/*用long int 是为了保证16位编译器也正常*/

int i,j

int k=0,l=0

for(i=1i<=40i++)

{

for(j=0j<=lj++)

{

r[j]=r[j]*i+k

k=r[j]/10000

r[j]=r[j]%10000

}

if(k)

{

l++

r[j]=k

k=0

}

j=l

printf("%d!=%d",i,r[j--])

for(j>=0j--)

{

printf("%04d",r[j])

}

printf("\n")

}

return 0

}

1!=1

2!=2

3!=6

4!=24

5!=120

6!=720

7!=5040

8!=40320

9!=362880

10!=3628800

11!=39916800

12!=479001600

13!=6227020800

14!=87178291200

15!=1307674368000

16!=20922789888000

17!=355687428096000

18!=6402373705728000

19!=121645100408832000

20!=2432902008176640000

21!=51090942171709440000

22!=1124000727777607680000

23!=25852016738884976640000

24!=620448401733239439360000

25!=15511210043330985984000000

26!=403291461126605635584000000

27!=10888869450418352160768000000

28!=304888344611713860501504000000

29!=8841761993739701954543616000000

30!=265252859812191058636308480000000

31!=8222838654177922817725562880000000

32!=263130836933693530167218012160000000

33!=8683317618811886495518194401280000000

34!=295232799039604140847618609643520000000

35!=10333147966386144929666651337523200000000

36!=371993326789901217467999448150835200000000

37!=13763753091226345046315979581580902400000000

38!=523022617466601111760007224100074291200000000

39!=20397882081197443358640281739902897356800000000

40!=815915283247897734345611269596115894272000000000

请按任意键继续. . .