题目:输入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作为一个强制定义符的值,这样能改善程序的可读性,也方便修改。这两个知识点是我以前不知道的,我觉得可以好好记下来。