洛谷P1009 阶乘之和

洛谷P1009 阶乘之和

这道题我还是用两种方法来写(C++/Java),具体的方法请参照下面这篇博客:

题目链接:

大整数的操作—阶乘,加法,乘法-----比对C++与java

在这里插入图片描述

解题思路:

java:

* 直接使用java自带的BigInteger,外加一个for循环就能搞定

C++:

* 直接模拟竖式加法和竖式乘法

好!废话不多说,直接看代码

Java代码:

import java.util.*;
import java.math.*;

public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int n=cin.nextInt();
        BigInteger sum=new BigInteger("0");
        for(int i=1;i<=n;++i)
        {
            BigInteger factorial=new BigInteger("1");
            BigInteger flag=BigInteger.valueOf(1);
            for(int j=1;j<=i;++j)
            {
                factorial=factorial.multiply(flag);
                flag=flag.add(BigInteger.valueOf(1));
            }
            sum=sum.add(factorial);
        }
        System.out.println(sum);
        cin.close();
    }
}

C++代码:

#include <bits/stdc++.h>
using namespace std;
const int maximum = 10e4+5;
int sum[maximum], a[maximum];
int main()
{
    int n;
    scanf("%d", &n);
    memset(sum, 0, sizeof(sum));
    memset(a, 0, sizeof(a));
    a[0] = 1;
    sum[0] = 1;
    int p = 1, sumUp = 1;
    for (int i = 2; i <= n; i++)    //    模拟阶乘
    {
        int up = 0, temp = 0;    
        for (int j = 0; j < p; ++j)    //    模拟进位
        {
            temp = a[j] * i + up;
            up = temp / 10;
            a[j] = temp % 10;
        }
        while (up > 0)
        {
            a[p++] = up % 10;
            up /= 10;
        }
        sumUp = max(sumUp, p);
        int flag = 0, tmp = 0, k = 0;
        for (k = 0; k < sumUp; ++k)    //    模拟加法
        {
            tmp = sum[k] + a[k] + flag;
            flag = tmp / 10;
            sum[k] = tmp % 10;
        }
        while (flag > 0)
        {
            sum[sumUp++] = flag % 10;
            flag /= 10;
        }
    }
    for (int i = sumUp - 1; i >= 0; --i)
        printf("%d", sum[i]);
    printf("\n");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章