zoukankan      html  css  js  c++  java
  • 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

    可当模板

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    名字 地址 路由
    截断二进制指数退避
    硬件地址 软件地址
    基带信号 调制
    非对称数字用户线
    码分复用 码分多址
    时分复用 帧长度
    多模光纤 单模光纤
    码间串扰 奈氏准则 香农公式
    flask 文件下载 文件服务器 请求参数 函数修饰符
  • 原文地址:https://www.cnblogs.com/yalphait/p/9385591.html
Copyright © 2011-2022 走看看