加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 01:58:59 所属栏目:大数据 来源:网络整理
导读:采用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[

采用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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读