解题思路:

S0 = 0 ; A1 = 1! = 1;
S1 = S0 + A1 = 1!; A2 = 2! = 2*1! = 2*A1 = 2*1;
S2 = S1 + A2 = 2! + 1!;A3 = 3! = 3*2*1 = 3*A2 = 3*2*1;
……依此类推
Sn = S(n-1) + An; An = n * A(n-1) = n!;

注意事项:

阶乘数值跨越幅度大,所以越往后数值跨越越大,如果数值类型大小搭配不当,很容易出现数值溢出。
重点是搭配的数据类型大小范围要合适。

  1. 类型名称 字节数 取值范围
  2. signed char 1 -128~+127
  3. short int 2 -32768~+32767
  4. int 4 -2147483648~+2147483647
  5. long int 4 -2147483648~+2141483647
  6. long long int 8 -9223372036854775808~+9223372036854775807
  7. long int 的简写是 long 占位符是:%ld
  8. long long int的简写是 long long 占位符是:%lld

具体查看limits.h头文件查看数据类型大小范围。

参考代码

  1. #include<stdio.h>
  2. int main(void)
  3. {
  4. unsigned long int Sn = 0, An = 1; //或long long类型也行
  5. int n, i;
  6. scanf("%d", &n);
  7. for (i = 1; n >= i; i++)
  8. {
  9. Sn = Sn + An;
  10. An = (i + 1) * An;
  11. }
  12. printf("%lu", Sn); //如果上面声明的是long long类型,这里占位符相应也就是%lld
  13. return 0;
  14. }
点赞(1)
 

9.2 分

36 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 38 条评论

荆棘鸟的呼唤 1年前 回复TA
#include<stdio.h>
int main()
{ 
	int a,n,Sn,i;
	a=1;
	Sn=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		a=a*i;
		Sn=Sn+a;
	}
	printf("%d",Sn);
	return 0;
}只有五十分,求指点0.0
yuling 1年前 回复TA
#include<stdio.h>
int main()
{
	unsigned long int Sn=0,n,i,a=1;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		a*=i;
		Sn+=a;
	}
	printf("%d",Sn);
	return 0;
}
大佬们,这种出什么问题了,只有50分
fighting 1年前 回复TA
#include<stdio.h>
int jc(int a)
{
       int t = 0, j = 1;
            for (t = a; t >= 1; t--)
            {
                j *= t;
            }
            return j;
}
int he(int b)
{
    int sum = 0;
    int k = 0;
    for (k = 0; k < b; k++)
    {
        sum = he(b - 1) + jc(b);
    }
    return sum;
}
int main()
{
    int n;
    scanf("%d", &n);
    printf("%d\n", he(n));
    return 0;
}
哪位大佬帮忙看看,只得了50分,时长超限了
土狗 1年前 回复TA
@yyyy 数值溢出 更换 sum的数据类型
yyyy 1年前 回复TA
求大佬指导,只有50分
#include <stdio.h>
int jiecheng(int m);
int jiecheng(int m){
  int h=1;
  for(int i=1;i<=m;i++){
    h*=i;
  }
  return h;
}
int main(void) {
  int t,n,sum=0;
  scanf("%d",&t);
  n=2;
  for(int i=1;i<=t;i++){
   sum+= jiecheng(i);

  }
  printf("%d\n",sum);

    
    return 0;
}
dotcpp0685076 1年前 回复TA
@uq_22651253872 乌拉
uq_22651253872 1年前 回复TA
@uq_22651253872 我明白了
uq_22651253872 1年前 回复TA
求大佬指导为什么我这么写是0分
#include<stdio.h>
int main()
{
    int i;
int sum=0;
int  ret = 1;
int n;
scanf_s("%d", &n);
if (n <= 20)
{
	for (i = 1; i <= n; i++)
	{
		ret *= i;
		sum += ret;

	}
}
printf("%d\n", sum);
    return 0;
}
悠游 1年前 回复TA
@橘 @dotcpp0676864 你这样与原本没区别,是数据类型的问题,第一段的话把sn和an改成long long类型,输出时去掉sn=,%d改为%lld;第二段的话把fun函数改成long long 类型,sum也改成long long类型,就好了
dotcpp0676864 1年前 回复TA
@橘 不对!就是小于