题目描述

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

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

输入格式

一个正整数NN。

输出格式

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

输入输出样例

输入 #
3
输出 #
9
 
这道题的数据50的阶乘超过了c语言所有数据类型的范围,也就是无法用long long类型,或者unsigned long long来解决
因此这里需要使用【高精度算法】,通俗点说明就是用数据模拟加减乘除
 
通过查询,学会了该算法的基本形式
(【入门】高精度算法——lazy-sheep :https://blog.csdn.net/zsjzliziyang/article/details/82050337 )
 
接下来就是应用到该题中了
这道题需要运用到高精度的乘法和加法
高精度算法的基本操作是通过把一个[字符数组]的数据转换成对应的[整数数组]
便可以通过字符数组的strlen()方法来获取数组长度
而在这道题中需要进行手动维护
 
先上AC代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int res[100010], p[100010];///res存放结果, p存放阶乘结果
int len0, len1;///len0维护res长度,len1维护p长度
void Plus()
{
int len = max(len0, len1);
for(int i = 0; i < len; i++){
res[i] = res[i] + p[i];
res[i+1] += res[i]/10;
res[i] = res[i]%10;
if(res[i] && i >= len0)len0++;
}
} void Multi(int a)
{ for(int i = 0; i < len1; i++)p[i] *= a;
for(int i = 0; i < len1; i++){
p[i+1] += p[i]/10;
p[i] = p[i]%10;
if(p[i+1] && i+1 >= len1)len1++;
}
}
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
memset(res, 0, sizeof(res));
memset(p, 0, sizeof(p));
res[0] = 0;
len0 = len1 = p[0] = 1;
for(int i = 1; i <= n; i++)
{
Multi(i);
Plus();
}
for(int i = len0-1; i >= 0; i--)printf("%d", res[i]);
printf("\n");
}
}

 

在乘法中,需要维护的是每次阶乘结果p的长度len1

每当进位的时候就需要对len1加1

void Multi(int a)
{ for(int i = 0; i < len1; i++)p[i] *= a;
for(int i = 0; i < len1; i++){
p[i+1] += p[i]/10;
p[i] = p[i]%10;
if(p[i+1] && i+1 >= len1)len1++;
}
}

  

在加法中,需要注意阶乘的结果p得到的数组长度都会比res长
同样每当进位的时候就需要对长度len0加1
void Plus()
{
int len = max(len0, len1);
for(int i = 0; i < len; i++){
res[i] = res[i] + p[i];
res[i+1] += res[i]/10;
res[i] = res[i]%10;
if(res[i] && i >= len0)len0++;
}
}

  

 

【洛谷】P1009 阶乘之和——高精度算法的更多相关文章

  1. 洛谷P1009 阶乘之和 题解

    想看原题请点击这里:传送门 看一下原题: 题目描述 用高精度计算出S=!+!+!+…+n! (n≤) 其中“!”表示阶乘,例如:!=****××××. 输入格式 一个正整数N. 输出格式 一个正整数S ...

  2. 洛谷——P1009 阶乘之和

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

  3. Java实现 洛谷 P1009 阶乘之和

    import java.util.Scanner; public class 阶乘之和 { public static void main(String[] args) { Scanner sc = ...

  4. 洛谷 P1009 阶乘之和 Label:高精度

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

  5. 洛谷 P1009 阶乘之和

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

  6. P1009 阶乘之和

    P1009 阶乘之和 题目提供者洛谷OnlineJudge 标签数论(数学相关)高精1998NOIp提高组NOIp普及组 难度普及- 通过/提交1139/3791 提交该题 讨论 题解 记录 题目描述 ...

  7. 洛谷P1119-灾后重建-floyd算法

    洛谷P1119-灾后重建 题目描述 给出\(B\)地区的村庄数NN,村庄编号从\(0\)到\(N-1\),和所有\(M\)条公路的长度,公路是双向的. 给出第\(i\)个村庄重建完成的时间\(t_i\ ...

  8. AC日记——阶乘之和 洛谷 P1009(高精度)

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

  9. P1009 阶乘之和 洛谷

    https://www.luogu.org/problem/show?pid=1009 题目描述 用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=54321. ...

随机推荐

  1. windbg分析dump-解决mscorwks不匹配

    目录 前言 什么是mscorwks 什么是SOS 什么是mscordacwks 上述错误是什么意思? 什么时候会出现该错误 如何修复错误 符号文件目录规则 相关资料 前言 在使用.net的生产环境时, ...

  2. Mysql中 int(3) 类型的含义

    注意:这里的(3)代表的并不是存储在数据库中的具体的长度,以前总是会误以为int(3)只能存储3个长度的数字,int(11)就会存储11个长度的数字,这是大错特错的. 其实当我们在选择使用int的类型 ...

  3. 记录从Winserver2012R2升级到Winserver2019

    升级系统是必不可少的,最近想搞虚拟化Hyper-V:于是着手需要装一台WIN server 2019. 手头有一台Winserver 2012R2,正好拿来测试升级,此博做一个记录. 操作流程:在升级 ...

  4. 井字棋小游戏(C语言)

    最近沉迷于<NetHack>.<DCSS>等字符游戏,对其很感兴趣,于是用C语言写了个字符界面的井字棋小游戏.欢迎大家指教. 编写时遇到了一些问题,我原先准备用循环,直到读取到 ...

  5. 【转载】绕过CDN找到源站的思路

    [原文:https://mp.weixin.qq.com/s/8NUvPqEzVjO3XbmCBukUvQ] 绕过CDN的思路 网上有很多绕过CDN的思路,但是存在很多问题,以下是收集并总结的思路.站 ...

  6. 【7】进大厂必须掌握的面试题-Java面试-Jsp

    1. jsp的生命周期方法是什么? 方法 描述 公共无效的jspInit() 与servlet的init方法相同,仅被调用一次. 公共无效_jspService(ServletRequest requ ...

  7. 解决/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory报错 (转)

    解决/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory报错 念淅 2020-01-03 15:02:25 3793 收 ...

  8. 极简 Node.js 入门 - 5.3 静态资源服务器

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  9. Apollo基于K8S的部署以及接入

    Apollo镜像服务 基于开源Apollo服务进行相关服务镜像打包,实际将分发apollo-adminservice.apollo-configservice和apollo-portal 这三个镜像安 ...

  10. solr之functionQuery(函数查询)【转】

    函数查询 让我们可以利用 numeric域的值 或者 与域相关的的某个特定的值的函数,来对文档进行评分. 怎样使用函数查询 这里主要有两种方法可以使用函数查询,这两种方法都是通过solr http 接 ...