这道题我还是用两种方法来写(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;
}