赞
踩
在本文中最推荐前缀和算法,也就是第四种,不仅看起来高大上一点,并且性能和耗时都是比较优秀的。
普通算法就是用for循环,设置一个变量sum,每一次都累加一个数。时间复杂度为O(n),不是很推荐的一个算法。
代码
#include<cstdio>
using namespace std;
int main() {
int sum = 0; //从1加到n的和,初始值为0
int n; //从1加到n
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
sum += i;
}
printf("%d", sum);
}
如果想控制一个范围,比如10加到100,那么只要把for循环的起始条件换成i=10
没啥好说的,一个简简单单的入门递归,从n开始加,每次递归减1,n到1的时候即退出。也不是很推荐使用,数据量过大的话内存消耗会过于严重。
代码
#include<cstdio> using namespace std; int func(int n) { if (n == 1)return 1; return func(n - 1) + n; } int main() { int sum = 0; //从1加到n的和,初始值为0 int n; //从1加到n scanf("%d", &n); sum = func(n); printf("%d", sum); }
如果想控制一个范围,比如10加到100,那么只要把递归条件的n1换成n10即可,这也是我为什么不用n == 100停止递归,并且不是func(n+1)的原因
一种就是高斯算法,一种就是前n项和,都是简单的套用数学公式即可,这两种方法推荐前一种,时间复杂度较低。后一种方法本文就不写啦。
高斯公式:
如果想控制一个范围,那么可以把1换成起始的数
前n项和公式
高斯公式代码
#include<cstdio>
using namespace std;
int main() {
int sum = 0; //从1加到n的和,初始值为0
int n; //从1加到n
scanf("%d", &n);
sum = (n + 1) * n / 2;
printf("%d", sum);
}
另一种方式略,简单的公式搬上去即可
这种方式是用了高中所学的一种方法如下:
把前1项,前2项,前3项…的和全部求出来放到数组s[n]中,之后就可以直接求出指定区间的数的和,并且时间复杂度为O(1),可谓是相当的快,并且具体的数的范围也能确定。
代码
#include<cstdio> const int N = 100010; int n, m; int a[N], s[N]; using namespace std; int main() { scanf("%d %d", &n, &m); //n为有几个数,m为前n项的和 for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } for (int i = 1; i <= m; i++) { s[i] = s[i - 1] + a[i]; //求出每一个前n项和,s[0]未赋值为0 } int l = 2, r = 4; //这里是需要求和的区间段,从第二个数到第四个数相加的和是多少 while (m--) { printf("%d", s[r] - s[l - 1]); } }
同时值得注意的,这个算法还可以更加精简,后面可以通过多进程并发的方式运行,设置锁等方式,上面的for运行一条数据,下面的for也立即运行一条数据,这样子,速度将会愈发的快。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。