C++实现前缀和算法(带推理过程)
一、定义
前缀和实际上就是数学上的前n项和,只不过将其应用与编程上可以实现获取某段区间的和的效果。
二、推理过程
将以下数据作为例子

其中a[]用于存储原始数据,sum[ ]用来存储前n项和数据。假定要求区间[0,2]的和,直接等于sum[2];要求区间[1,2]的和那么只需要用sum[2]-sum[0]即可,要求区间[2,4]的和那么只需要用sun[4] - sum[1]即可…那么最终可以得出结论,要求区间[L,R]的和,当L为0时,其区间的和为:sum[R],当L不为0时,其区间的和为sum[R]-sum[L-1]

三、代码编写
细节:在编写函数的时候可以采用简便的写法(通过三目运算符的方式):
#define get_sum(L,R) (L? sum1[R] - sum1[L-1]:sum1[R])
#include<iostream>
#include<algorithm>
using namespace std;
//书写简短函数
//不用定义类型加上三目运算符
//#define get_sum(L,R) (L? sum1[R] - sum1[L-1]:sum1[R])
const int n = 5;
int sum[n];
int get_sum(int l, int r)
{
if (l > 0)
{
return sum[r] - sum[l - 1];
}
else
{
return sum[r];
}
}
int main()
{
//定义数据类型的数组
int a[5] = { 1,3,5,7,9 };
//将数据处理一下变为前缀和数组
//首项
sum[0] = a[0];
//其他项
for (int i = 1; i < n; i++)
{
sum[i] = sum[i - 1] + a[i];
}
cout<<"[0,2]:" << get_sum(0, 2) << endl;
cout<<"[1,2]:" << get_sum(1, 2) << endl;
cout<<"[2,4]:" << get_sum(2, 4) << endl;
}
四、结果
