题目描述
求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。
输入n,输出Sn的值。
基本思路
先求阶乘,再计算阶乘之和。定义一个函数用于计算阶乘。
易错点
容易忽略n不超过20的前提,当n接近20时结果可能溢出
代码
错误代码
#include<stdio.h>
int factorial(int);
int main()
{
int n, sum = 0, i;
scanf("%d", &n);
for(i = 1; i <= n; i++)
sum += factorial(i);
printf("%d", sum);
return 0;
}
int factorial(int n)
{
if(n >= 2)
return factorial(n - 1) * n;
else if(n == 1)
return 1;
}
正确代码
上面代码错误的原因就是没有考虑n较大时使用int的溢出情况
正确代码如下:
#include<stdio.h>
long int factorial(int);
int main()
{
int n, i;
long int sum = 0;
scanf("%d", &n);
for(i = 1; i <= n; i++)
sum += factorial(i);
printf("%ld", sum);
return 0;
}
long int factorial(int n)
{
long int f;
if(n >= 1)
{
f = factorial(n - 1) * n;
return f;
}
else if(n == 0)
return 1;
}
跟第一段代码的区别在于sum类型由int变成了long int,函数中返回的factorial(n - 1)*n用long int变量f表示