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)

动态规划:熟练度练习(POJ 1458最佳加法表达式bailian2755POJ3624bailian1088)

poj/OpenJ_Bailian - 2528 离散化+线段树