1091:求阶乘的和时间限制: 1000 ms    内存限制: 65536 KB

【题目描述】

给定正整数n,求不大于n的正整数的阶乘的和(即求1!+2!+3!+...+n!),输出阶乘的和。

【输入】

输入有一行,包含一个正整数n(1 < n < 12)。

【输出】

输出有一行:阶乘的和。

【输入样例】

5

【输出样例】

153

说明:

主要考查嵌套循环,以及关于数学中阶乘的知识。

本题是一本通中嵌套循环第一题,需要学生了解嵌套循环的运行过程,以及何种问题适合使用嵌套循环解决。

题目概述:

1!+2!+3!+...+n!,阶乘用感叹号"!"表示,3!表示3的阶乘。

所谓阶乘,是等于及小于给定的正整数的乘积。

例如3的阶乘:

3!=1×2×3=6

n!=1×2×3×...×n

题目样例中求5的阶乘:

1!=1

2!=1×2=2

3!=1×2×3=6

4!=1×2×3×4=24

5!=1×2×3×4×5=120

那么1!+2!+3!+4!+5!=1+2+6+24+120=153

思路分析:

本题可以使用一层循环和嵌套循环解决,代码中将展示这两种方法。不过以嵌套循环为主,加深对嵌套循环的理解。

从1!+2!+3!+...+n!可以看出,如果少了感叹号,就是一个普通的等差数列求和,使用一层循环即可。虽然现在求的是阶乘之和,但其原理还是一样的,先看一层循环的实现:

for (int i = 1; i <= n; i++)

sum += i!;

很明显,只要得出i的阶乘,然后像等差数列求和般即可。

再看看求i的阶乘,上面《题目概述》已说明:

i!=1×2×...×i

其实不难看出i!=1×2×...×i和i!=1+2+...+i非常相似,可以说二者只是运算的符号一个是乘号,一个是加号罢了。

很明显,求某个数的阶乘也要用一个循环。符合嵌套循环的使用规则。即求n个数的阶乘之和,外层循环用于遍历1~n每一个数,而内层循环求外层循环当前数字的阶乘。

如果还不明白,可以举个例子:

现有编号为1~10的10个箱子,每个箱子装有不同数量的礼物,要统计10个箱子中所有礼物的数量。

拆开1号箱子,数一数箱子中礼物的数量。

拆开2号箱子,数一数箱子中礼物的数量。

...

拆开10号箱子,数一数箱子中礼物的数量。

全部箱子拆开,并都统计了每个箱子的礼物数量,那么最终的数量就出来了。

该例子与本题求阶乘之和是一样的:

拆开10个箱子相当于10个数的阶乘。

数一数某一个箱子的礼物数量,相当于求某一个数的阶乘。

累计10个箱子的礼物数量,相当于求10个数字的阶乘之和。

外层循环代表的是10个箱子中的每一个箱子,例如当第2次循环时,表示要拆2号箱子。

内层循环代表外层循环中的某个箱子,要在内层循环中算出该箱子的礼物数量。

这就是嵌套循环,作为初学者首先要明白嵌套循环的原理,以及什么情况下适合使用嵌套循环。

数据类型:n(1 < n < 12),经过测试,阶乘之和的最大值不超过int类型的取值范围,可选int类型。

延伸学习:

阶乘的单词是factorial,在编程中,可以缩写为fac。

求解过程:

声明3个int类型变量n、fac、sum = 0,fac用于求每一阶段数字的阶乘,sum用于求所有数的阶乘之和。

输入1个正整数给变量n。

循环n次,i初始为1,循环条件是i<=n,i++,循环体中:

1.fac赋值为1。

2.内层循环,循环i次,j初始为1,循环条件是j<=i,j++,循环体中:

1.将fac乘以j的值赋给fac,即求i的阶乘。

3.将sum加上fac的值赋给sum。

循环外:

输出阶乘之和sum的值。

运行结果:

参考代码 - 嵌套循环:

i是当前要计算阶乘的数,而j是i的阶乘计算范围,范围是1~i,所以内层循环j初始为1,结束为i。

注意代码中语句fac = 1,在计算i的阶乘时,因为是用fac存储i的阶乘,所以先把fac赋值为1,即从1开始相乘。就好比上述数礼物的例子,假设第2个箱子有10个礼物,数第3个箱子的礼物时,不是在第2个箱子的基础上数(即从11开始数),而是从头开始数。每个箱子都是独立的,都应该从1开始数。

#include using namespace std;int main(){    int n, fac, sum = 0;    cin >> n;    for (int i = 1; i <= n; i++)    {        fac = 1;        for (int j = 1; j <= i; j++)            fac *= j;        sum += fac;    }    cout <    return 0;}

参考代码 - 一层循环(递推算法):

以数箱子礼物为例,嵌套循环的思路是每个箱子的礼物都是独立的,例如1号箱子有10个礼物,2号箱子有20个,3号箱子有30个...

最后把每个箱子的礼物数目加在一起就是总数:

10+20+30+...

即每个箱子都是独立,互不相干的。

现在把每个箱子的礼物数目都在上一个箱子礼物数目的基础上开始数。例如1号有10个,2号从11开始数,3号从31开始数,数到最后就是最终的数目。

求阶乘之和也是一样的道理。

1!=1

2!=1×2=2

3!=1×2×3=6

4!=1×2×3×4=24

5!=1×2×3×4×5=120

相邻两个数的阶乘,后面之数比前面之数多乘了一个数。例如3!比2!多乘了一个3。合并再看看:

1!=1

2!=1!×2=2

3!=2!×3=6

4!=3!×4=24

5!=4!×5=120

其实就是说,求一个数的阶乘时,不必从1开始乘,用上一个数的阶乘再乘以该数就得出该数的阶乘。

有点类似斐波那契数列,第k(k>2)个数是前两数之和。

所以应从第1项开始,不断往后推导,求得一个数的阶乘时,立即累计在sum中,下次循环时,不把fac初始为1,而是继续与下个数相乘。

这就是递推算法,可以使用递归或迭代来实现。

#include using namespace std;int main(){    int n, fac = 1, sum = 0;    cin >> n;    for (int i = 1; i <= n; i++)    {        fac *= i;        sum += fac;    }    cout <    return 0;}

END

注:题目来源于网络,转载于《信息学奥赛一本通(C++版)在线评测系统》,点击下方的【阅读原文】即可打开该题的链接。

题解属于本微信公众号【大神编程】原创。

4. linux调用文件计算阶乘前5项和_【题解循环】1091:求阶乘的和相关推荐

  1. 4. linux调用文件计算阶乘前n项和_用一道有趣的小题谈谈性能优化--求阶乘和的末6位

    此题来源:算法竞赛入门经典(第2版) P21 /** * 输入n, 计算 S = 1! + 2! + ... n! 的末六位(不含前导0).* n < 10^6* n! 表示阶乘, 是前n个正整 ...

  2. 4. linux调用文件计算阶乘前5项和_嵌入式Linux系统编程——文件读写访问、属性、描述符、API

    Linux 的文件模型是从 Unix 的继承而来,所以 Linux 继承了 UNIX 本身的大部分特性,然后加以扩展,本章从 UNIX 系统接口来描述 Linux 系统结构的特性. 操作系统是通过一系 ...

  3. 妙用Python内置函数int()快速计算等比数列前n项和

    本文要点在于Python内置函数int()的用法,所以计算等比数列前n项和时没有使用数学上的公式Sn=a1*(1-q^n)/(1-q). 一般遇到这样的问题,很容易想到使用循环来实现,以计算1+2+4 ...

  4. java求斐波那契前n项和_算法之斐波那契数列如何求第n个值与前n项和?(Java)...

    斐波那契数列 指的是这样一个数列:1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n& ...

  5. python求阶乘之和_python计算阶乘前n项和

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 知道公式后就很简单了,利用for循环,第几行i+1就等于几,当然python中是 ...

  6. 【C语言】计算调和函数前100项

    解题思路: 1.调和函数前100项如下:       1 / 1 - 1 / 2 + 1 / 3 - 1 / 4 + 1 / 5 -- + 1 / 99 - 1 / 100  2. 规律: 一正一负, ...

  7. 信息学奥赛一本通 1091:求阶乘的和 / 2026:【例4.12】阶乘和 / OpenJudge NOI 1.5 34

    [题目链接] ybt 2026:[例4.12]阶乘和 ybt 1091:求阶乘的和 OpenJudge NOI 1.5 34:求阶乘的和 [题目考点] 1. 求一个数的阶乘 假设求n的阶乘,设结果变量 ...

  8. win10恢复linux引导文件,easybcd误删Win10启动项,UEFI恢复引导

    想给电脑安Ubuntu双系统,期间根据一些不靠谱的文章用了easybcd软件,Ubuntu没安上,反而把Windows的引导弄没了,这软解真没坑啊. 回复Windows引导需要用Windows系统盘来 ...

  9. pta求阶乘序列前n项和_序列问题总结-超级巧妙

    最近发现两个题目,用栈解决非常精巧,特此分享: leetcode456: 给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j ...

最新文章

  1. 如何学好机器学习数据挖掘?这本《数据分析数学基础》图文并茂带你学习入门...
  2. 2005年2月9日(星期三) 晚上,熱 - 大年初一,首次創作。
  3. Python语言编程之批量文件重命名
  4. 关于Oracle undostat中的2012和ORA-01555问题的自我解答
  5. 基本算法--冒泡排序
  6. C++彩色数据流动界面
  7. 我心中的ASP.NET Core 新核心对象WebHost(二)
  8. Spring包名代码提示
  9. 道路矢量数据下载教程
  10. 软件无线电(SDR)及高频/高速(RF/Hi-Speed)标准集
  11. matlab 使用textscan读取带文本的csv文件
  12. catia今天突然打不开了_catia打不开的解答
  13. win10系统修改电脑 hosts 地址
  14. 短视频无尽流前端开发指南
  15. STM32F4的中断
  16. 计算方法/数值分析牛顿下山法C/C++实现方法
  17. 解释#define的用法
  18. pulsar分析以及各消息队列对比
  19. FileReader和FileWrite介绍
  20. 教程:简单几步制作出酷炫网页版简历

热门文章

  1. windows php7 apache,windows系统下php7+apache2.4环境搭建
  2. mysql empty table_【MySQL】 empty table and delete table.
  3. SpringMV工作流程分析
  4. 忆阻尖峰神经网络中基于STDP的模式识别学习的必要条件
  5. leetCode-995:K 连续位的最小翻转次数
  6. jenkins中文插件_Jenkins学习笔记(一)
  7. ARGMAX(以及ARGMIN)的意思
  8. ipa解包打包工具_ios打包ipa的四种实用方法(.app转.ipa)
  9. android适配性报告,关于Android的多种屏幕适配
  10. 遍历结果集java_java – 循环遍历while循环后如何将结果集重置为第一行