洛谷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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章