给出一个正整数n,输入n个数,并求这n个数的某个区间的和。
首先要定义一个数组,这个数组的大小要比n要大,否则会出现越界的情况,用这个数组来装这n个数。先给出代码,随后附上解析。
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int sum[100005];//将数组放在函数外面就会将数组里的每个值都初始化为0
int main(){
int N,M;
int L,R;
int t;
cin>>N>>M;
for(int i=1;i<=N;i++){ //i从1开始,即从数组的第二位开始赋值,数组的第一位为0
cin>>a[i];
}
sum[0]=a[0];
for(int j=1;j<=N;j++){ //j要从1开始,sum[j-1]才有正确的值 ,从0开始j-1数组会越界
sum[j]=sum[j-1]+a[j];
}
for(t=0;t<M;t++){
cin>>L>>R;
printf("%d\n",sum[R]-sum[L-1]);
}
return 0;
}
对于这个代码,N是指数的个数,M是求这N个数的区间和的次数(即求M个区间的和),L,R是指区间的起始。
假设N=5,M=2,输入1 2 3 4 5,再求两次区间的和,第一个区间L=1,R=3;第二个区间的和L=2,R=4。则最后会输出6和9.
解析:
a[1]=1,a[2]=2,a[3]=3;a[4]=4,a[5]=5
sum[o]=a[o]
sum[1]=a[1]
sum[2]=a[1]+a[2]=sum[1]+a[2]
sum[3]=a[1]+a[2]+a[3]=sum[2]+a[3]
sum[4]=a[1]+a[2]+a[3]+a[4]=sum[3]+a[4]
sum[5]+a[1]+a[2]+a[3]+a[4]+a[5]=sum[4]+a[5]
......
所以前缀和:sum[i]=sum[i-1]+a[i]
求区间【2,4】的和:a[2]+a[3]+a[4]=sum[4]-sum[1]
所以求区间【L,R】的和:sum[L,R]=sum[R]-sum[L-1]