解题思路:

    思路没什么好说的,不考虑时间复杂度的话可以循环加递归求和求解。第二种是利用阶乘求和的性质,避免重复运算达到时间复杂度的优化。


    直接上手第二种,边求阶乘边求和。

    

注意事项:


    百分之五十错误的代码基本都是定义的变量范围过小,导致部分大数的程序产生错误。诸如int , float ,double都会超范围。

    直接告诉大家,一般大数或者大数组,直接开全局变量或者是用 long long 类型,此题用 long long或者是long double 类型可以完美AC。

    附上各变量范围:

        整型[signed]int                  -2147483648~+2147483648
        无符号整型unsigned[int]                       0~4294967295
        短整型 short [int]                                    -32768~32768
        无符号短整型unsigned short[int]             0~65535
        长整型 Long int                            -2147483648~+2147483648
        无符号长整型unsigned [int]                   0~4294967295
        字符型[signed] char                               -128~+127
        无符号字符型 unsigned char                       0~255
        单精度 float                                 3.4 x 10^(-38)~  3.4 x 10^(+38)
        双精度double                              1.7 x 10^(-308)~  1.7 x 10^(+308)
        长双精度 long double                 1.7 x 10^(-308)~  1.7 x 10^(+308)


参考代码:

        

    #include<bits/stdc++.h>

using namespace std;

int main()
{
 int n;
 long long sn = 1;
 long long sum = 0;
 cin>>n;
 for(int i = 1; i <= n; i++)
 {
  sn = sn * i;
  sum = sum + sn;

 }
 printf("%0.lld",sum);
    return 0;
}


点赞(1)
 

0.0分

16 人评分

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

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

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

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

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

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

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

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

评论列表 共有 14 条评论

没人要的阿豪 3年前 回复TA
@智者不入爱河 最后输出那里s(n)的%d改成%lld试试
七月 3年前 回复TA
@Shallvee long 不够,要long long
Shallvee 3年前 回复TA
可我long int为什么还是错误50?
jackson 4年前 回复TA
@智者不入爱河 方法感觉有丢丢的麻烦
思无邪 4年前 回复TA
@思无邪 @17738377482 已解决,楼主写的文章很棒。
思无邪 4年前 回复TA
@思无邪 @8221219166 改完之后对了,感谢回复
啊噗卡巴 4年前 回复TA
@思无邪 你把输出那里没有随着输入改变,%d写成%lld试试
小可爱 4年前 回复TA
谢谢你!
智者不入爱河 4年前 回复TA
#include<stdio.h>
int n=0;
long long  f(n)
{
	if (n == 1 || n == 0)
		return 1;
	else
		return f(n - 1)*n;
}
long long  s(n)
{
	if (n == 1)
		return 1;
	else
		return s(n - 1) + f(n);
}
int main()
{
	scanf("%d", &n);
	if (n <= 20)
	{
		printf("%d", s(n));
	}
	return 0;
}
求大佬康康我,运行没有问题,也改成长整型了,可还是错了
chenyu 4年前 回复TA
@思无邪 内存范围一般是开数组空间才会考虑超出范围  你这里还是数据的问题 把int换成long long 就可以了