例题2-7 阶乘之和

题目:输入n,计算S=1!+2!+3!+...+n!得末6位(不含前导0)。n<=10^6,n!表示前n个正整数之积。

样例输入:10

样例输出:37913

思路(1)利用递归定义一个函数求出n以及n递减后每个数的阶乘;利用for循环求出各个数阶乘之和,再除以1000000得出S。

思路(2)如果不利用递归,也可以利用for循环,一步步求出阶乘然后累加,最后除以1000000得出S。

不过我觉得用思路一会好一点,虽然会麻烦一些,但是能够容易理解一些以及涉及到的知识点会比思路二多一点。

代码:

#include "stdio.h"

int f(int n)

{

int N;

if(n==0)

  N=1;

else N=f(n-1)*n;

    return N;

}

int main()

{

    int n,i,sum,S;

    scanf("%d",&n);

    sum=0;

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

    {

    sum+=f(i);

    }

    S=sum%1000000;

    printf("%d\n",S);

    return 0;

}

进行结果:

递归函数的语句还可以这样写:

int f(int n)

{

    return n==0?1:f(n-1)*n;

}

这就是利用了三目运算符“ ? :”这个运算符的意思是判断 ?前的语句,如果为真,则执行 :左边的语句,如果为假,则执行 :右边的语句。用这个三目运算符进行计算阶乘是一种更为简便的方法,两种方法各有好处。

看了书本例题的解答,发现书里答案所用的是我上面所讲的思路二,看下来代码的确简短了不少,况且书中答案在循环中用到了累乘器factorial,这样可以一步求出阶乘更为方便;还将1000000作为一个强制定义符的值,这样能改善程序的可读性,也方便修改。这两个知识点是我以前不知道的,我觉得可以好好记下来。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容