洛谷[NOIP1998 普及组] 阶乘之和 (C语言,高精度加法,高精度×低精度,高精度阶乘) | 您所在的位置:网站首页 › c语言阶乘怎么打出来 › 洛谷[NOIP1998 普及组] 阶乘之和 (C语言,高精度加法,高精度×低精度,高精度阶乘) |
文章目录
[NOIP1998 普及组] 阶乘之和题目描述分析完整代码
[NOIP1998 普及组] 阶乘之和
题目描述
用高精度计算出 S = 1 ! + 2 ! + 3 ! + ⋯ + n ! S = 1! + 2! + 3! + \cdots + n! S=1!+2!+3!+⋯+n!( n ≤ 50 n \le 50 n≤50)。 其中 ! 表示阶乘,定义为 n ! = n × ( n − 1 ) × ( n − 2 ) × ⋯ × 1 n!=n\times (n-1)\times (n-2)\times \cdots \times 1 n!=n×(n−1)×(n−2)×⋯×1。例如, 5 ! = 5 × 4 × 3 × 2 × 1 = 120 5! = 5 \times 4 \times 3 \times 2 \times 1=120 5!=5×4×3×2×1=120。 输入格式 一个正整数 n n n。 输出格式 一个正整数 S S S,表示计算结果。 样例 #1 样例输入 #1 3样例输出 #1 9提示 【数据范围】 对于 100 % 100 \% 100% 的数据, 1 ≤ n ≤ 50 1 \le n \le 50 1≤n≤50。 【其他说明】 注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 n ≤ 20 n \le 20 n≤20,使用书中的代码无法通过本题。 如果希望通过本题,请继续学习第八章高精度的知识。 NOIP1998 普及组 第二题 分析 我们分开计算,因为求得是阶乘之和,我们可以先算每个的阶乘(用到高精度阶乘),算好阶乘之后我们在相加(用到高精度加法);高精度加法以及其他高精度算法可点击查看我往期文章,这里我着重讲一下高精度阶乘; ps:本来昨天写完高精度×高精度我还很开心,结果今天刷这题就打击到我了,居然还有个高精度×低精度,唉,学无止境啊,高精度系列算法看的太多,知识来源基本都来源于b站,指路:麦克老师讲算法、信息学万老师等。其实原理与高精度×低精度很类似,区别在与: (1)高精度阶乘数组长度未知,动态生成。 (2)高精度阶乘不需要翻转数组。 (PS:这些都不重要,把核心思想弄明白,我讲的这些就自然而然明白了,我写的越多,你们可能越不想看)此处补充一下高精度×低精度的思想: (1)将高精度的数拆开用数组存储,具体方法为定义 char 类型数组s存储要输入的值,再将其转化成 int 型存入 int 型数组a中,为了方便操作,再将其转置(以上步骤都与我最初写的高精度加法一样); (2)低精度看题目要求是用 int 还是 long long; (3)拆开存入数组a后,逐位与低精度相乘,再进位,此处进位与加法进位不同,最后可能有多位进位,需单独处理; (4)核心代码: int jinWei = 0; for (int i = 0; i a[lena++] = jinWei % 10; jinWei = jinWei / 10; }(5)别忘了处理前导0和逆着输出; (6)图示理解(千言万语尽在图中): Last but not least !!! 我写了这么多高精度算法,最容易犯的错误就是,我经常写错是 / 还是 %,一找找半天 本位是取余,进位是除。 若果有错,欢迎大家斧正!ヾ(✿゚▽゚)ノ |
CopyRight 2018-2019 实验室设备网 版权所有 |