题目描述

用高精度计算出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. 高效学习必备软件:OneNote+ Mindmaster

    做笔记有两个关键点: 一是笔记内容详略得当.二是知识的框架清晰完整. 为什么这样说? 举个例子,如图是我的笔记界面,用的是免费的OneNote, OneNote是微软出的笔记软件, 非常好用,有着书写 ...

  2. Layman 分享到朋友圈或发送给朋友

    *主要是介绍如何在网页中实现发送给朋友和分享到朋友圈时内容参数自定义的功能 微信JS接口 1.微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包; 通过使用微信JS-SDK, ...

  3. selenium学习之元素等待(四)

    --为什么要设置元素等待: 目前大多数web应用程序都是使用AJAX和JavaScript开发,每次加载一个网页,包括静态网页和动态网页,也就是加载各种HTML标签和JS文件.在网页中进行元素定位时, ...

  4. [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型

    [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型 作者:u0u0 - iTyran 在上一节中,我们分析了OBJ格式.OBJ格式优点是文本形式,可读 ...

  5. JDK1.8新特性之(三)--函数式接口

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  6. MATLAB鼠标事件

    来源:https://blog.csdn.net/weixin_39090239/article/details/80586930 前记: 人机交互的方式--键盘开关.鼠标.触摸屏.体感传感器(Kin ...

  7. Zyan Drench,支持Wifi的Android游戏

    下载source - 298 KB 介绍 "雨淋"是一款最初使用Adobe Flash开发的单人游戏(你可以试试谷歌一下"世界上最简单的Flash游戏").它相 ...

  8. Python 的映射数据类型有哪些?零基础小白入门学习必看

    1 映射类关系 Python 的 collections.abc 模块内拥有 Mapping 和 MutableMapping 这两个抽象基类,它们为 dict 和其他类似的类型提供了接口定义. mu ...

  9. 学习WebDav

    目录 前言 初识WebDav 有哪些支持webdav的网盘? WebDAV的特性和优势 服务端的搭建 调用WebDav接口 PROPFIND方法 PROPPATCH方法 MKCOL方法 PUT方法 G ...

  10. postgreSQL与Kingbase 字符串裁剪区别

    --postgreSQL postgres=# select substring('abcdefg',0,4); substring abc (1 行记录) postgres=# select sub ...