昨天老师有讲到树状数组自己下来查了下资料及一些学习
参考资料http://www.cnblogs.com/zhangshu/archive/2011/08/16/2141396.html
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define N 16
using namespace std;
int a[N],c[N];
int lowbit(int x)//取出x二进制从的最后一个1 例,x=6 二进制为0110 则lowbit(6)=0010 转换为10进制就是2
{
return x&(-x);
}
void creat()//创建c[n]数组
{
int k;
for(int i=1;i<=N;i++)
{
k=lowbit(i);
for(int j=i;j>i-k;j--)
c[i]+=a[j];
printf("%3d",c[i]);
}
}
int sum(int n)//求和
{
int sum=0;
while(n>0)
{
sum+=c[n];
n-=lowbit(n);
}
return sum;
}
void modify(int x,int val)//修改
{
while(x<=N)
{
c[x]+=val;
x+=lowbit(x);
}
}
int main()
{
for(int i=1;i<=N;i++)
{
a[i]=rand()%10+1;
printf("%3d",a[i]);
c[i]=0;
}
printf("\n");
creat();
printf("\n");
int t;
t=sum(8);
printf("%d ",t);
return 0;
}