永发信息网

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

答案:3  悬赏:0  手机版
解决时间 2021-01-02 10:07
#include int main(){ int a[5000]={0,1},co=1,n; scanf("%d",&n); for(int i=2;i<=n;i++) { int jinwei=0; for(int j=1;j<=co;j++) { a[j]=a[j]*i+jinwei; if(a[j]/10000) { jinwei=a[j]/10000; a[j]%=10000; } else jinwei=0; } if(jinwei) a[++co]=jinwei; } printf("%d",a[co]); for(--co;co;--co) printf("%04d",a[co]); 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=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;    
}
全部回答
#include<stdio.h> int f[4000]; void main() { int i,j,n; scanf("%d",&n); for(i=0;i<4000;i++) f[i]=0; f[0]=1; for(i=2;i<=n;i++) { int c=0;//进位 for(j=0;j<4000;j++) { int s=f[j]*i+c; f[j]=s%10; c=s/10; } } for(j=3999;j>=0;j--) if(f[j]) break; for(i=j;i>=0;i--) printf("%d",f[i]); printf("\n"); } 主要运用了,乘法的基本原理,用数组的每一个元素来存储个位十位百位千位……

你可以看看这个模拟乘法运算过程。

#include    <stdio.h>    #include    <conio.h>       long    result[10000];    //声明一个足够长的数组       main()       {        void    jiech(int    input);    //求阶乘的函数        int    a,i;        printf("intput    n:");        scanf("%d",&a);//输入要求的数             for(i=0;i<10000;i++)    //给数组附初值         result[i]    =    0;        result[9999]    =    1;    //给最底位    1;             jiech(a);//开始求阶乘        for(i=0;i<10000&&result[i]==0;i++);    //前面的数组是0的跃过        int    j    =    i;    //此时的j,i是最高位。也就是数组里第一个高位!=0的数        for(;i<10000;i++)    //开始输出结果        {       //如果有数组元素是一个0的,输出000;       if(result[i]==0)    {    printf("0000");    continue;    }        if(result[i]/1000==0    &&    result[i]/100!=0&&result[i]/10!=0&&i!=j)         {    printf("0%ld",result[i]);    continue;    }    //如果数组元素<100&&>10    的输出时在前面加一个0        if(result[i]/100==0    &&    result[i]/10!=0&&i!=j)         {    printf("00%ld",result[i]);    continue;    }    //    如果数组元素<10&&>0    的输出时在前面加    00;        if(result[i]/10==0    &&    i!=j)    {printf("000%ld",result[i]);    continue;}        printf("%ld",result[i]);        }        printf("\n");        getch();       }            void    jiech(int    input)       {        int    i,j;        //如果输入1,不用算。因为初值里就是1。当然还有一些情况不用算,在这里就没有判断了。        if(input    ==    1)    return;         do{        for(i=0;i<10000&&result[i]==0;i++);    //跟上面一样,前面的数组是0的跃过        //开始运算,用输入的数跟数组的每一元素相乘        for(;i<10000;i++)   //不对i赋初值        result[i]    *=    input;        for(i=0;i<10000&&result[i]==0;i++);    //跟上面一样,前面的数组是0的跃过             for(j=9999;j>=i;j--)    //开始整理结果,让每个元素进位,并且存三位        {         if(j<2)        //如果超过数组的长度,输出you    are    crazy!,等待接收字符。        {    printf("you    are    crazy!\n");    getch();    getch();    return;}

 //把六位以后的位进到后面第二个元素里,并且本元素丢掉这些位。        result[j-2]    +=    result[j]/100000000;    result[j]    =    result[j]%100000000;         //把三位以后的位进到后面第一个元素里,并且本元素丢掉这些位。        result[j-1]    +=    result[j]/10000;    result[j]    =    result[j]%10000;              }        input--;    //输入的数递减        }    while(input>1);    //如果数减到1,退出。       }   

我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
中国现存建园组早的皇家园林是?
单选题Doyouthinkdogsare________difficult
1651年,英国颁布《航海条例》所针对的是A.法
“姜还是老的辣”这句话的由来?
信用卡有欠款影响公积金贷款吗
单选题下列句子中,没有用比喻修辞方法的一项
厦门的高崎机场怎么到曾厝垵
Measures have been taken to prevent the ac
智能手机的金属外壳和塑料外壳有什么区别
最后一课(节选)13分阅读答案
感悟生命据《海南日报》报道,28岁的海南省大
be friendly to与 be friendly with的区别
单选题北伐战争中率铁军攻克武昌的将领是A.叶
问:愿赌服输,本店概不赊账,用婉转的话怎么
启辰r50方向盘比刚买回来时重了很多怎么回事
推荐资讯
耳机发烧的人讲的“木耳”是什么意思?
岁暮到家蒋士铨中写出诗人与母亲见面场景的诗
判断题棱长是1分米的正方体纸盒放在桌子上,
梦见变色龙
请问,69满修WZ有2000w+经验要染果子吗?,先走
如何辨别电脑的色彩与亮度等处在正常状态中?
带如的名字
一个平行四边形和一个三角形的底相等,它们面
鄞州区塘溪镇上周村村民委员会地址有知道的么
微波爆米花哪里有卖
怎么查询我的学位证书
月经总是提前怎么回事?如何调理?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?