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

推荐订阅源

N
News and Events Feed by Topic
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
T
Threat Research - Cisco Blogs
Cloudbric
Cloudbric
Recent Commits to openclaw:main
Recent Commits to openclaw:main
I
Intezer
Attack and Defense Labs
Attack and Defense Labs
P
Privacy International News Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
L
Lohrmann on Cybersecurity
C
Cybersecurity and Infrastructure Security Agency CISA
V2EX - 技术
V2EX - 技术
AWS News Blog
AWS News Blog
O
OpenAI News
L
LINUX DO - 最新话题
N
News | PayPal Newsroom
PCI Perspectives
PCI Perspectives
www.infosecurity-magazine.com
www.infosecurity-magazine.com
T
Troy Hunt's Blog
Latest news
Latest news
D
Darknet – Hacking Tools, Hacker News & Cyber Security
A
Arctic Wolf
Spread Privacy
Spread Privacy
G
GRAHAM CLULEY
T
Tor Project blog
博客园_首页
Know Your Adversary
Know Your Adversary
有赞技术团队
有赞技术团队
S
Secure Thoughts
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
T
Tailwind CSS Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
V
Visual Studio Blog
J
Java Code Geeks
Cisco Talos Blog
Cisco Talos Blog
Schneier on Security
Schneier on Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security Affairs
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理
雷峰网
雷峰网
宝玉的分享
宝玉的分享
量子位
Last Week in AI
Last Week in AI
月光博客
月光博客
罗磊的独立博客
S
SegmentFault 最新的问题

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