用高精度计算出S=1!+2!+3!+…+n!(n ≤ 50)其中“!”表示阶乘,例如:5!=5*4*3*2*1。

链接:https://ac.nowcoder.com/acm/contest/1069/C
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 262144K,其他语言524288K

64bit IO Format: %lld

题目描述

用高精度计算出S=1!+2!+3!+…+n!(n ≤ 50)其中“!”表示阶乘,例如:5!=5×4×3×2×1。

输入描述:

输入正整数N

输出描述:

输出计算结果S

示例1

输入

3

输出

9

数组模拟人类的算法懂吧?

规定:a×b a为被乘数,b为乘数 ; a+b a为被加数,b为加数;

对哟,乘除法是不一样的呀,做乘除法要把乘数作为正常的变量,不用数组模拟,而对于加减法则是对被加数和加数都要做模拟;

看代码吧,比讲的清楚,不难 0.0
本题的代码如下:

#include
#include
#include
#include
using namespace std;
int sum[1000];
int ans = 1;
int a[1000];
void Factorial(int n) {
 memset(a, 0, sizeof(a));
 a[1] = 1;
 int ans1 = 1;
 for (int i = 1; i <= n; i++) {         //乘法
  int carry = 0, j;                    //carry进位数
  for (j = 1; j <= ans1; j++) {
   int m = a[j] * i + carry;
   a[j] = m % 10;		      //余数当做本位数字
   carry = m / 10;		      //更新进位数
  }
  while (carry != 0) {		      //乘法最后进位可能不止一次
   a[j] = carry % 10;
   carry /= 10;
   j++;
   ans1++;
  }
 }
 int carry = 0, i;
 for (i = 1; i <= ans1 || i <= ans; i++) {   //加法
  int temp = a[i] + sum[i] + carry;
  sum[i] = temp % 10;
  carry = temp / 10;
 }
 if (carry != 0) {
  sum[i] = carry;
  ans++;
 }
}
int main()
{
 int N;
 scanf("%d", &N);
 for (int i = 1; i <= N; i++) {
  Factorial(i);
 }
 int i;
 for (i = 1000; i > 0; i--) {
  if (sum[i] != 0)break;
 }
 for (; i >= 1; i--) {
  printf("%d", sum[i]);
 }
 return 0;
}

你可能感兴趣的:(模拟)