C语言高精度求阶乘之和(利用数组)思路整理

C语言高精度求阶乘之和(利用数组)思路整理。

题目描述
用高精度计算出 S=1!+2!+3!+⋯+n!
其中“!”表示阶乘,例如:5!=5×4×3×2×1

基本思路:利用数组模拟,数组的位置代表不同的位
例如:fac[1]代表个位,fac[2]代表十位,感觉有点类似数学中的列竖式计算。

#include<stdio.h>
#define LEN 10000

int main()
{
    int fac[LEN]={0};//求阶乘的数组
    int sum[LEN]={0};//依次存储阶乘之和的数组
    int i,j,k;	//计数的变量
    int n;		//最后一个阶乘
    
    scanf("%d",&n);
    if(n==1){		//先考虑1的阶乘,初始化1的值
        printf("%d",1);
        return 0;	//设置一个出口
    }
    int x=0;	//x为进位的数
    fac[1]=1;	//初始化1的阶乘,并从2的阶乘的和开始
    for(i=1;i<=n;i++){	//外层的循环保证算出各个数阶乘的值
        for(j=1;j<=LEN;j++){	//里层的循环算出当前数的阶乘
            fac[j]=fac[j]*i+x;	//当前储存的是j-1的阶乘,令每个一位上的数同乘j
            x=fac[j]/10;		//x为int型,求出进位的数
            fac[j]=fac[j]%10;	//更新当前数
        }
        for(k=1;k<=LEN;k++){	//求和,每求出一个阶乘加一次
            sum[k]=sum[k]+fac[k];	
            if(sum[k]>=10){		//进位
                sum[k+1]+=1;
                sum[k]=sum[k]%10;
            }
        }
    }
    for(i=LEN;i>=1;i--){ 	//求出应当输出的数字所在位置
        if(sum[i]!=0)
            break;
    }
    for(j=i;j>=1;j--){		//倒序输出
        printf("%d",sum[j]);
    }
    return 0;
}

总结:大体来说,解这道题最重要的是要理解如何用数组模拟阶乘,其他的都是细节上的东西。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值