洛谷P1009 阶乘之和


/*用高精度计算出 S = 1! + 2! + 3! + ···+n!(n<=50)*/
#include <iostream>
using namespace std;

int a[101], s[101];
/*这里我们定义了两个int数组,a数组的作用是,计算某个数的阶乘,
然后把答案装在数组内,(一个单元里面只装一个数字),
然后s数组是用来装和的值,a数字只能用来装某一个数的阶乘,s只能用来
装和*/


/*Product函数用来计算某一个数的阶乘,将结果放在a数组中*/
void Product(int x){
    int jw = 0;
    for(int i=100; i>=0; i--){
        a[i] = a[i]*x+jw;
/*假设从2开始,下面我们已经把末尾的值赋为了1,然后每次每一个数字的
阶乘就是这样的,比如说5!=5*4!,而4!我们已经计算出来,并且已经
保存在了a数组中,所以每次只需要用x去乘数组,就是普通的乘法原理,用
x乘以数字的末尾的哪一位,然后依次往前面乘*/
        jw = a[i]/10;
        a[i] %= 10;
    }
}
/*sum函数是用来计算和的,Prouduct每计算了一个数的阶乘,通过sum函数,
把每个数的阶乘累加到s数组中*/
void sum(){
    int jw = 0;
    for(int i=100; i>=0; i--){
        s[i] = s[i]+a[i]+jw;
        jw = s[i]/10;
        s[i] %= 10; 
    }
}
//输出函数 
void Print(){
    int start = 0;
/*因为我们的结果是倒着存的,先存在最后一位,然后是倒数第二位,依次向前
所以越靠前数组单元位置就可能为0,我们在输出的时候不需要把0输出,
所以这里我们定义了一个start值,用来标记第一个部位0的值*/
    for(int i=0; i<=100; i++){
        if(s[i]){
            start = i;
            break;
        }
    }
    for(int i=start; i<=100; i++)
        cout << s[i];
}

int main(){
    
    int n;
    cin >> n;
    
    a[100] = s[100] = 1;
/*这里我们用了两个函数,一个是Product和sum函数*/ 
    for(int i=1; i<=n; i++){
        Product(i);
    //每计算依次,就累加依次 
        sum();
    }
    
    Print();
    
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值