微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大数的存储问题,计算1~40所有数的阶乘

采用int数组存储每一位,模拟乘法操作,逐位相乘,往前进位。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
/***
函数:计算i!的值
**/
void Cal(int i,int big[50])
{
    int j,up,res,m;
    int ge,shi;//乘数的个位,十位
    int big1[50],big2[50];
    if(i==1)
    {
        big[0]=1;
    }
    else if(i<=9)
    {
        j=0;
        up=0;
        while(big[j]!=-1)
        {
            res = big[j]*i+up;
            big[j] = res%10;
            up = res/10;
            j++;
        }
        if(up!=0)
            big[j] = up;
    }
    else
    {
        ge = i%10;
        shi = i/10;
//*****计算被乘数与十位数的乘积,存到big1[50]里
        for(m=0;m<50;m++)
        {
            big1[m]=big[m];//十位数字的乘积
        }
        j=0;
        up=0;
        while(big1[j]!=-1)
        {
            res = big1[j]*shi+up;
            big1[j] = res%10;
            up = res/10;
            j++;
        }
        if(up!=0)
            big1[j] = up;
        while(big1[j]==-1)
            j--;
        while(j>=0)
        {
            big1[j+1]=big1[j];
            j--;
        }
        big1[0]=0;
//*****计算被乘数与个位数的乘积
        if(ge!=0)//个位数不为零
        {
            for(m=0;m<50;m++)
            {
                big2[m]=big[m];//big2[50]存放个位数字的乘积
            }
            j=0;
            up=0;
            while(big2[j]!=-1)
            {
                res = big2[j]*ge+up;
                big2[j] = res%10;
                up = res/10;
                j++;
            }
            if(up!=0)
                big2[j] = up;
            //将big1[50]与big2[50]逐位相加
            up=0;
            for(m=0;m<50;m++)
            {
                if(big1[m]!=-1 && big2[m]!=-1)//都没到最高位
                {
                    big[m]=(big1[m]+big2[m]+up)%10;
                    up = (big1[m]+big2[m]+up)/10;
                }
                else if(big1[m]==-1 && big2[m]==-1)//都是还未使用的位
                {
                    if(up!=0)
                    {
                        big[m]=up;
                        up = 0;
                    }
                    else
                        big[m]=-1;
                }
                else if(big1[m]!=-1 && big2[m]==-1)//一个是最高位,一个不是
                {
                    big[m]=(big1[m]+0+up)%10;
                    up = (big1[m]+0+up)/10;
                }
            }
        }
        else//个位数为零,直接将big1[50]赋给原数组
        {
            for(m=0;m<50;m++)
            {
                big[m]=big1[m];
            }
        }

    }
}
int main()
{
    int big[50],i,j;
    for(i=0;i<50;i++)
    {
        big[i]=-1;
    }
    for(i=1;i<=40;i++)
    {
        Cal(i,big);
        printf("%d!=",i);
        j=0;
        while(big[j]!=-1)
        {
            j++;
        }
        j--;
        while(j>=0){
            printf("%d",big[j]);
            j--;
        }
        printf("\n");
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐