• 18.7.29 luogu P1009 阶乘之和[高精加法&乘法]


    题目描述

    用高精度计算出 S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!++n!(n50)

    其中“!”表示阶乘,例如: 5!=5 imes 4 imes 3 imes 2 imes 15!=5×4×3×2×1 。

    输入输出格式

    输入格式:

     

    一个正整数 NN 。

     

    输出格式:

     

    一个正整数 SS ,表示计算结果。

     

    输入输出样例

    输入样例#1: 
    3
    
    输出样例#1: 
    9
     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <math.h>
     5 #include <iostream>
     6 
     7 using namespace std;
     8 
     9 struct num {
    10     int a[100];
    11     num(){ memset(a, 0, sizeof(a)); }
    12     num(int x) {
    13         memset(a, 0, sizeof(a));
    14         int i = 0;
    15         while (x) {
    16             i++;
    17             a[i] = x % 10;
    18             x /= 10;
    19         }
    20         a[0] = i;
    21     }
    22     num operator +(num p) {
    23         int l = max(a[0], p.a[0]);
    24         num ans;
    25         for (int i = 1; i <= l; i++) {
    26             ans.a[i] += a[i] + p.a[i];
    27             if (ans.a[i] > 9) {
    28                 ans.a[i] -= 10;
    29                 ans.a[i + 1]++;
    30             }
    31         }
    32         if (ans.a[l + 1] != 0)l++;
    33         ans.a[0] = l;
    34         return ans;
    35     }
    36     num operator *(num p) {
    37         num ans;
    38         for(int i=1;i<=a[0];i++)
    39             for (int j = 1; j <= p.a[0]; j++) {
    40                 ans.a[i + j - 1] += a[i] * p.a[j];
    41                 ans.a[i + j ] += ans.a[i + j - 1] / 10;
    42                 ans.a[i + j - 1] %= 10;
    43                 ans.a[0] = max(ans.a[0], i + j - 1);
    44                 if (ans.a[i + j ] != 0)
    45                     ans.a[0] = max(ans.a[0], i + j );
    46             }
    47         return ans;
    48     }
    49     void print() {
    50         printf("%d", a[a[0]]);
    51         for (int i = a[0] - 1; i >= 1; i--)
    52             printf("%d", a[i]);
    53         printf("
    ");
    54     }
    55 };
    56 
    57 int main()
    58 {
    59     int n;
    60     scanf("%d", &n);
    61     num tmp(1),ans(0);
    62     for (int i = 1; i <= n; i++) {
    63         tmp=tmp*i;
    64         ans = ans + tmp;
    65     }
    66     ans.print();
    67     return 0;
    68 }
    View Code

    可当模板

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    消息中间件(一)MQ详解及四大MQ比较
    SIP协议
    PAT (Basic Level) Practice 1008 数组元素循环右移问题
    LeetCode-Algorithms 1. 两数之和
    PAT (Basic Level) Practice 1040 有几个PAT
    PAT (Basic Level) Practice 1023 组个最小数
    PAT (Basic Level) Practice 1021 个位数统计
    PAT (Basic Level) Practice 1007 素数对猜想
    PAT (Basic Level) Practice 1006 换个格式输出整数
    PAT (Basic Level) Practice 1004 成绩排名
  • 原文地址:https://www.cnblogs.com/yalphait/p/9385591.html
Copyright © 2020-2023  润新知