Bailian2684 POJ NOI0105-34 求阶乘的和迭代+函数+循环
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bailian2684 POJ NOI0105-34 求阶乘的和迭代+函数+循环相关的知识,希望对你有一定的参考价值。
问题链接:POJ NOI0105-34 求阶乘的和
2684:求阶乘的和
总时间限制: 1000ms 内存限制: 65536kB
描述
给定正整数n,求不大于n的正整数的阶乘的和(即求1!+2!+3!+…+n!)
输入
输入有一行,包含一个正整数n(1 < n < 12)。
输出
输出有一行:阶乘的和。
样例输入
5
样例输出
153
来源
计算概论05
问题链接:Bailian2684 求阶乘的和
问题简述:(略)
问题分析:
原先的题解只是题解,不够透彻,参见参考链接。所以,这里重写题解。
题目指定n<12,int类型可以存储下阶乘之和,不会产生数据溢出。如果n再大一些则需要用long long类型。更大的n则需要采用大数计算来解决。
解法一:循环处理
循环处理是常见的做法,一个循环控制n项求和,另外一个循环控制阶乘计算。这种做法的缺点是重复的阶乘计算多,n越大则重复计算越多,影响计算速度。
解法二:函数
把功能封装到函数,也是常见的做法。功能函数可以复用,工程项目中一般都要这样来做。然而,这种做法重复重复计算问题依旧存在。
解法三:迭代
无重复计算,程序速度快的做法是采用迭代计算。也许本题用迭代计算来解决才是正解。
程序说明:(略)
参考链接:Bailian2684 POJ NOI0105-34 求阶乘的和【迭代】
题记:简单问题程序也蕴含解题密码。
AC的C语言程序(解法三:迭代)如下:
/* Bailian2684 求阶乘的和 */
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
int fact = 1, sum = 0, i;
for (i = 1; i <= n; i++)
fact *= i, sum += fact;
printf("%d\\n", sum);
return 0;
}
AC的C++语言程序(解法二:函数)如下:
/* Bailian2684 求阶乘的和 */
#include <stdio.h>
int fact(int n)
{
int fact = 1, i;
for (i = 2; i <= n; i++)
fact *= i;
return fact;
}
int main(void)
{
int n;
scanf("%d", &n);
int sum = 0, i;
for (i = 1; i <= n; i++)
sum += fact(i);
printf("%d\\n", sum);
return 0;
}
AC的C++语言程序(解法一:循环处理)如下:
/* Bailian2684 求阶乘的和 */
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
int sum = 0, i, j;
for (i = 1; i <= n; i++) {
int fact = 1;
for (j = 2; j <= i; j++)
fact *= j;
sum += fact;
}
printf("%d\\n", sum);
return 0;
}
以上是关于Bailian2684 POJ NOI0105-34 求阶乘的和迭代+函数+循环的主要内容,如果未能解决你的问题,请参考以下文章
Bailian4029 数字反转进制(POJ NOI0105-29)
Bailian2676 整数的个数入门(POJ NOI0105-11)
Bailian2734 十进制到八进制入门(POJ NOI0113-45)
Bailian2735 八进制到十进制入门(POJ NOI0113-46)