大数阶乘

用数组求大数阶乘问题:

      思路:用数组来存放阶乘的每一位数字,首先令第一位的数值为1,位数为1,然后将每次相乘的乘积存回数组,并循环处理数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加前一位的数值后存回前一位的数组中,再将余数存回原来位数的数组中。(如不甚明白,看具体实例)

      实例:求5的阶乘。

      i=2时,a[0]=2.  此时

      数组中表现形式:0  0  0  2

      i=3时,a[0]=6.  此时

      数组中表现形式:0  0  0  6

      i=4时,a[0]=24,此时24>10,a[0]=24%10=4,a[1]=24/10=2.  此时

      数组中表现形式:0  0  2  4

      i=5时,a[0]=120,此时120>10,a[0]=120%10=0,a[1]=120/10=12,此时12>10,a[1]=12%10=2,a[2]=12/10=1.  此时

      数组中表现形式:0  1  2  0

代码如下:

#include <stdio.h>
int main()
{
    int a[10001];
    int d;     //位数
    int i,j,r,k;
    int N;
    for(i=1;i<10000+1;i++)
        a[i]=0;
    a[0]=1;
    a[1]=1;
    d=1;
    scanf("%d",&N);
    for(i=1;i<N+1;i++)
    {
        for(j=1;j<d+1;j++)
            a[j]*=i;
        for(j=1;j<d+1;j++)
        {
            if(a[j]>10)
            {
                for(r=1;r<d+1;r++)
                {
                    if(a[d]>9)
                        d++;
                    a[r+1]+=a[r]/10;
                    a[r]=a[r]%10;
                }
            }
        }
    }
    for(k=d;k>0;k--)
        printf("%d",a[k]);
    return 0;
}


 
 
另外还有一种方法: 

      思路:用数组来存放阶乘的每一位数字,首先令a[0]=1(除a[0]之外其他数组元素赋值为0),按照最基本的乘法运算思想来考虑,将临时结果的一项乘以阶乘元素(加上进位),具体文字在代码中说明。

代码如下:

#include<stdio.h>
#include<string.h>
#define MAX 20000
int main()
{
    int n,i,a[MAX],c,s,j;
    scanf("%d",&n);
    memset(a,0,sizeof(a));
    a[0]=1;
    for(i=2;i<=n;i++)     //从2开始求阶乘
    {
        c=0;
        for(j=0;j<MAX;j++)//处理数组中元素,使其每个数据元素为一位数字
        {
            s=a[j]*i+c;   //相应阶乘中的一项与当前所得临时结果的某
                          //位相乘(加上进位)
            a[j]=s%10;    //更新临时结果
            c=s/10;       //是否进位
        }
    }
    for(j=MAX-1;j>=0;j--) //判断所得最终结果在数组中的临界
    {
        if(a[j])
           break;
    }
    for(i=j;i>=0;i--)
    {
        printf("%d",a[i]);
    }
    printf("\n");
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值