大数阶乘

本文介绍了一种计算大数阶乘的算法实现,通过数组存储多位数并使用逐位相乘加进位的方法,避免了传统整型数据类型的限制。详细解释了算法流程,包括初始化、乘法运算及进位处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
int main()
{
    int a[10000];
    int n,len;
    int i,j,digit,carry,t;
    while(scanf("%d",&n)&&n!=0)
    {
        len=1;
        a[0]=1;
        digit=1;
        carry=0;
        for(i=2;i<=n;i++)
        {
            for(j=0;j<digit;j++)
            {
                t=a[j]*i+carry;
                a[j]=t%10;
                carry=t/10;//斩除一位
            }
            while(carry)
            {
                a[digit++]=carry%10;//保留一位
                carry/=10;//再斩
                len++;
            }
        }
    for(i=digit-1;i>=0;i--)
        printf("%d",a[i]);
    putchar('\n');
    printf("len=%d\n",len);
    }
    return 0;
}

原理:第一;n!=  (n-1) ! * n

            第二:将前面所得阶乘存入数组, a[0]中存入个位,a[1]十位,以此类推

             第三:数组乘以某个数的计算方法为,从a[0]开始,依次乘以该数,大于十则进位

列如:5!=120        (首先a[0]=1,carry=0)

第一次循环:2!,t=a[0]*2+carry=2,a[0]=t %10 =2  ;  carry=0.

第二次循环:3! ,t=a[0] * 3+carry = 6, a[0]=t % 10 =6 ,carry=0.

第三次循环:4!,t= a[0]*4+carry=24,  a[0]=t%10=4 (即个位,carry=t/10=2,然后进入while,a[1]=carry/10=2;digif变为2;carry/10=0

第四次循环:5!,t=a[0]*5+carry=20,a[0]=t%10=0,carry=t / 10=2

                  接着 t=a[1] *5+carry=2 * 5+2=12;a[1]=t %10 =2;carry =t / 10=1;

                  最后进入while,a[2]=carry %10 =1,carry=carry /10=0,结束!

最后将数组倒着输出!完毕!!!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值