二叉堆
2015-07-09 22:25
411 查看
#include<stdio.h> #include<stdlib.h> int lowbit(int x) { int z; z = ~x; z++; return (x & z); } //测试 /*int main(void) { int n,t; n = 50; while(n) { t = lowbit(n); printf("%d\n",t); n -= t; } return 0; }*/ /*求和*/ int Sum(unsigned int *C,unsigned n) { int sum = 0; while(n > 0) { sum += C ; //printf("%d ",sum); n -= lowbit(n); } return sum; } /*修改某位置的值*/ void Change(unsigned* c,int n,int a) { int m; printf("当前位置现在为%d,亲输入你要赋予它的新值\n",a); scanf("%d",&m); m = -a+m; while(n <= 1000) { c += m; n += lowbit(n); } } int main(void) { unsigned int A[1000],c[1000]; unsigned i,j,k,n,s,m; unsigned int N; scanf("%u",&N); ///scanf("%u",A[1]); for(i = 1;i <= N;i ++) { k = 1; //m = i; scanf("%u",&A[i]); c[i] = A[i]; if(j = lowbit(i)) { while(k < j) { c[i] += A[i - k]; k ++; } } } for(i = 1;i <= N;i ++) printf("%d ",c[i]); printf("请输入你想求前多少个数的和\n"); scanf("%d",&n); s = Sum(c,n); printf("%d\n",s); printf("请输入你想修改的数的位置:\n"); scanf("%d",&n); Change(c,n,A ); for(i = 1;i <= N;i ++) printf("%d ",c[i]); printf("请输入你想求前多少个数的和\n"); printf("请输入你想求前多少个数的和\n"); scanf("%d",&n); s = Sum(c,n); printf("%d\n",s); return 0; }
相关文章推荐
- 鼠标移到datalist或者是grivdview上显示全部内容
- hadoop 2.7.0版本发布
- LeetCode || Two Sum
- 转:MyBean的安装
- 黑马程序员——高新技术---Java基础语法-数据类型和运算符
- Android第一天
- Java将某个目录下的所有文件及内容复制到另一目录
- ssh 端口转发实现外网 80 端口映射到内网 80 端口
- C#特性类的使用
- 第一个Android程序 -- HelloAndroid(续)
- [Keyword]static/const/volatile/intterupt的使用及注意
- poj3253Fence Repair 解题题解
- Linux常用文件介绍
- 南阳oj 题目98 成绩转换
- android得到控件的高度
- ssh
- 【数字图像处理之四】图像的放大缩小旋转
- 堆排序
- POJ1659Havel-Hakimi定理判断图的可图性
- sap scriptfom 多语言翻译