• 洛谷P1009 阶乘之和 题解


    想看原题请点击这里:传送门

    看一下原题:

    题目描述
    用高精度计算出S=1!+2!+3!+…+n! (n≤50)
    
    其中“!”表示阶乘,例如:5!=5*4*3*2*1 5!=5×4×3×2×1。
    
    输入格式
    一个正整数N。
    
    输出格式
    一个正整数S,表示计算结果。
    
    输入输出样例
    输入
    3
    输出
    9

    如果这道题不需要用高精度的话那就变得很简单了,但由于我们看到了洛谷贴上了“高精度”的标签但由于这道题目是求阶乘和所以越往后n的阶乘就会越大。

    又因为n!=n*(n-1!,所以有转移方程n!=n*(n-1)!避免重复运算(ROS只是唠叨一句防止有些人不知道忘记这一方法)

    高精度也很平常,但ROS这道题debug了好久就是因为‘+=’写成了‘=’

    所以写代码一个地方错了就会出现各种玄学bug呀

    代码如下:

     1 #include<bits/stdc++.h>
     2 #define N 1000000
     3 using namespace std;
     4 int n;
     5 int tmp[N];
     6 int lt;
     7 int a[N];
     8 int la;
     9 int lm;
    10 void cal(int);
    11 int main(){
    12     scanf("%d",&n);
    13     tmp[1]=1;
    14     lt=1;
    15     for(int i=1;i<=n;i++){
    16         cal(i);
    17         lm=max(lt,la);
    18         for(int j=1;j<=lm;j++){
    19             a[j]+=tmp[j];
    20         }
    21         for(int j=1;j<=lm;j++){
    22             a[j+1]+=a[j]/10;
    23             a[j]%=10;
    24         }
    25         la=lm;
    26         while(a[la+1]>0){
    27             la++;
    28             a[la+1]+=a[la]/10;
    29             a[la]%=10;
    30         }
    31     }
    32     for(int i=la;i>2;i--){
    33         if(a[i]==0){
    34             la--;
    35             continue;
    36         }
    37         break;
    38     }
    39     for(int i=la;i>=1;i--){
    40         printf("%d",a[i]);
    41     }
    42     return 0;
    43 }
    44 void cal(int x){
    45     for(int i=1;i<=lt;i++){
    46         tmp[i]*=x;
    47     }
    48     for(int i=1;i<=lt;i++){
    49         if(tmp[i]>=10){
    50             tmp[i+1]+=tmp[i]/10;
    51             tmp[i]%=10;
    52         }
    53     }
    54     while(tmp[lt+1]>0){
    55         lt++;
    56         tmp[lt+1]+=tmp[lt]/10;
    57         tmp[lt]%=10;
    58     }
    59     return ;
    60 }
  • 相关阅读:
    spring快速入门
    Vue整合ElementUI搭建项目
    .Net的Rsa解密
    Maven配置国内仓库
    pom.xml
    SpringBoot文件打包后修改配文件
    .net 过滤器
    c#语法糖汇总
    git修改远程地址
    abp Application层,接口服务层,获取请求的信息
  • 原文地址:https://www.cnblogs.com/robertspot/p/12370027.html
Copyright © 2020-2023  润新知