题目:1.计算n的阶乘
2.计算1!+2!+ … +10!
分析:首先得知道 n的阶乘 意思就是 n! = n x (n-1) x (n-2 )x ..... x 2 x 1 。假设我们现在要求 5 的阶乘,那5!= 5x4x3x2x1=120。从下面的式子可见,只要从 1 的阶乘开始求然后求 n 的阶乘只需要在 (n-1) 的阶乘上乘上 n 就可以了。
5!= 5x4x3x2x1 = 5 x 4!
4!= 4x3x2x1 = 4 x 3!
3!= 3x2x1 = 3 x 2!
2!= 2x1 = 2 x 1!
1!= 1 = 1 x 1!
代码段:
#includeint main() { int i=0; int n=0; int ret=1; scanf("%d", &n); for (i=1; i<=n; i++) { ret*=i; } printf("%dn", ret); return 0; }
运行结果:输入5后,得到的结果为120, 正确。
OK,既然 n 的阶乘已经求出来了;那么我们求 1!+2!+ … +10!的结果的时候,只需要将每次计算的阶乘的结果相加就可以了。
#include//2.计算1!+2!+3!+......+10! int main() { int i=0; int n=0; int sum=0; for (n=1; n<=10; n++) { int ret=1; for (i=1; i<=n; i++) { ret*=i; } sum+=ret; } printf("%dn", sum); return 0; }
最终计算出来的结果是 4037913 正确。
不过这里值得注意的是 : 这里 ret 的初始化必须放在计算 n 的阶乘的那个循环的外面,不然计算结果就会出错
下面来举个例子说明:1!+2!+ 3!= 1 + 2 + 3 = 9
如下面的代码所示,int ret =1 放在了循环的外面,计算的结果就会出错,变成了15。 因为第一次计算结束后 ret=1; 第二次计算结束后,ret=2;那么第三次结算结束后,ret=12。所以每次计算n的阶乘开始之前都要把 ret 初始化为1
#includeint main() { int i=0; int n=0; int sum=0; int ret=1; for (n=1; n<=3; n++) { for (i=1; i<=n; i++) { ret*=i; } sum+=ret; } printf("%dn", sum); return 0; }
那么我们把 ret 的舒适化放进循环的时候结果就是正确的。
#includeint main() { int i=0; int n=0; int sum=0; for (n=1; n<=3; n++) { int ret=1; for (i=1; i<=n; i++) { ret*=i; } sum+=ret; } printf("%dn", sum); return 0; }
OK 到此为止的话,计算的结果算是初步完成了。
那么在最后值得一提的是!!!
上面的计算 1!+2!+ … +10!这个结果的时候用到了 两个for循环 这样的话代码的时间复杂度就会变高,代码效率就会降低。
那下面我们来将代码小小地优化一下;如下面的代码所示,只用了一个for循环就可以将得出结果。
#includeint main() { int ret=1; int n=0; int sum=0; for (n=1; n<=10; n++) { ret*=n; sum+=ret; } printf("sum=%dn", sum); return 0; }



