输入格式
求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。
输入格式
n
输出格式
Sn的值
样例输入
5
样例输出
153
题解
然后直接先上题解
#include<stdio.h>
int main()
{
int n,a=1;
long long sum=0,m=1; //为这是阶乘求和,一般的int 类型可能就不够,因此我们利用long long int 类型
scanf("%d",&n); //输入需要乘到多少的阶乘
for(a=1;a<=n;a++) //利用循环加1
{
m=a*m; //一个循环利用上一个阶乘的结果加1直接乘
sum=sum+m; //阶乘求和
}
printf("%lld",sum); //输出和
return 0;
}
分析
前面的int一般就是拿来控制循环的,定量n就是为了scanf的输入。
我们先来讲一下这个循环,
for(a=1;a<=n;a++)
{
m=a*m;
sum=sum+m;
}
我们一开始已经定义了a的值和输出了n的值
这个循环就是为了让它m的值可以一直乘(a++),就可以达到阶乘的效果。
sum也在循环里,因此每循环一次就可以实现加上上一个数的和
直到a与n的值相同,就刚好实现阶乘总和后退出循环
前面之所以使用
long long sum=0,m=1;
是因为我相信很多童鞋一开始也是想使用简单的用“%d"来输出sum
但是结果是
很显然哈,前面的测试点能过,而后面的过不了,很多童鞋就大概就猜到是后面的输出有问题。
突然想到n如果等于20,那这个值肯定非常大
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
所以我一开始就只把sum用 long long 来定义
但是结果如上,还是相同的报错,又看到有个m,自然m的值肯定也是相当大的
所以 sum 和 m 我都用了 long long 来定义
最后这个输出
printf("%lld",sum);
注意哈,用了 long long 来定义,这个输出的”%lld",里面不是数字11哈,是L的小写。