惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
M
MIT News - Artificial intelligence
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
Engineering at Meta
Engineering at Meta
Martin Fowler
Martin Fowler
H
Help Net Security
B
Blog
Y
Y Combinator Blog
小众软件
小众软件
S
SegmentFault 最新的问题
I
InfoQ
爱范儿
爱范儿
Hugging Face - Blog
Hugging Face - Blog
D
Docker
博客园 - 【当耐特】
J
Java Code Geeks
阮一峰的网络日志
阮一峰的网络日志

博客园 - NOIP/NOI辅导

ubuntu下查看(改变)本地端口开放情况,开启和关闭防火墙 [NOIP] - CCF NOIP2018普及组初赛试题+答案 [NOIP题目] - 方格取数 [NOIP题目] - 铺地毯 [NOIP题目] - 马拦过河卒 [NOI题目] - 抽签 中小学阶段,学习NOIP信息学有用吗? [信息学奥赛] NOI2018冬令营获奖名单 信息学奥赛介绍 五大学科竞赛 从哪个年级学习信息学奥赛好呢? NOI-001 —《C++编程及竞赛训练》 NOI-002 —《普及组竞赛强化训练课程》 NOI-003 —《初级算法课程》 [iOS] 解决Xcode rename failed的问题 [Android] - Android Studio 执行Log.v和Log.d 不显示打印 [Git] 403 error [React-Native] RelativeLayout是相对布局控件 - 转 [Android] 代码中动态设置shape
[NOIP] - 阶乘之和
NOIP/NOI辅导 · 2018-10-06 · via 博客园 - NOIP/NOI辅导

题目描述

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

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

输入输出格式

输入格式:

一个正整数NN。

输出格式:

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


分析

当n = 50时,结果为:

31035053229546199656252032972759319953190362094566672920420940313

没有一个适当的类型可以容纳这么长的一串数字,按正常的思路做,会导致溢出的异常,可以考虑将结果垵位保存到数组中,然后垵位输出。

思路:

代码

#include <iostream>
#include <string.h>


using namespace std;

int ans[5001];
int arr[5001] = {1};
int maxLen = 1;

void factorial(int n){
    
    int len = maxLen;
    if(n == 1) arr[0] = 1;
    
    //first calculate by bit
    for(int j = 0; j < len; j++){
        arr[j] *= n;
    }
    
    //整理
    for(int j = 0; j < len; j++){
        if(arr[j] / 10 != 0){
            arr[j+1] += arr[j] / 10;
            if(j == len - 1){
                len++;
                if(len > maxLen) maxLen = len;
            }
        }
        arr[j] = arr[j] % 10;
    }
}

int main(int argc, const char * argv[]) {
    // insert code here...
//    std::cout << "Hello, World!\n";
    
    int n = 1;
    cin>>n;
    
    for(int i = 1; i <= n; i++){
        factorial(i);
        
        for(int j = 0; j < maxLen; j++){
            
            ans[j] += arr[j];
            
            if(ans[j] / 10 != 0){
                ans[j+1] += ans[j] / 10;
                ans[j] = ans[j] % 10;
                if(j == maxLen - 1){
                    maxLen++;
                }
            }
            
        }
    }
    
    
    for(int j = maxLen - 1; j >= 0; j--){
        cout << ans[j];
    }
    
    return 0;
}