求大神给个C语言大数阶乘的程序,要有注释的!

求大神给个C语言大数阶乘的程序,要有注释的!,第1张

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

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

}

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    

}

#include <cstdio>

#include <cmath>伏配

#define pi 3.14159265

#define e 2.718281828

int main()

{

int n,num//所求为n!的位数,num为位数

scanf("%d",&n)

if(n==0)

{

num=1

}

else

{

num=(int)((0.5*log(2*pi*n)+n*log(n)-n)/log(10))+1

}

printf("%d",num)

}

使用斯特林公式,n!约等于sqrt(2*pi*n)*(n/e)^n,如不理解需更多信答信息或者有使用高精缺坦指度(long long不够)的需求继续追问


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12400958.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存