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

推荐订阅源

F
Fortinet All Blogs
Attack and Defense Labs
Attack and Defense Labs
V2EX - 技术
V2EX - 技术
O
OpenAI News
S
Secure Thoughts
H
Heimdal Security Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Schneier on Security
Schneier on Security
H
Hacker News: Front Page
S
Security Affairs
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Proofpoint News Feed
The Register - Security
The Register - Security
GbyAI
GbyAI
Cloudbric
Cloudbric
MongoDB | Blog
MongoDB | Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
K
Kaspersky official blog
Forbes - Security
Forbes - Security
Y
Y Combinator Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
Scott Helme
Scott Helme
Hacker News - Newest:
Hacker News - Newest: "LLM"
The Cloudflare Blog
Recorded Future
Recorded Future
人人都是产品经理
人人都是产品经理
Cyberwarzone
Cyberwarzone
C
CERT Recently Published Vulnerability Notes
Webroot Blog
Webroot Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LangChain Blog
T
Tor Project blog
Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Hacker News: Ask HN
Hacker News: Ask HN
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog RSS Feed
N
News and Events Feed by Topic
阮一峰的网络日志
阮一峰的网络日志
I
Intezer
V
V2EX
T
Tailwind CSS Blog
SecWiki News
SecWiki News
NISL@THU
NISL@THU
C
Check Point Blog

博客园 - 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;
}