求循环数组的最大子数组的和
一、程序要求
1、输入一个整数数组,数组中有正数也有负数;
2、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
3、如果数组A[0].......A[j-1]首尾相邻,允许A[i-1],......A[n-1],A[0].......A[j-1]之和最大;
4、同时返回最大子数组的位置。
二、程序设计思想
此次要求的是求数组中间的某一段和最大,关键是求数组首尾相接的某一段元素的和最大,中间部分的和小于0,所以求出数组总和,然后减去这部分元素的和。求这部分的和的时候,将数组求反,用上次的方法求出就行,再加上数组的总和,即为所求。
三、源程序
//李俏、张莹荧,2016.3.26 //求整数数组的最大子数组的和,数组可循环 #include<iostream> #include<string.h> #include<stdio.h> using namespace std; typedef long long LL; LL maxsum(int a[], int n) { int i; int start=0,end=0; LL maxsum = 0; LL sum = 0; for(i=0; i<n; i++) { if(sum < 0) { sum = a[i]; //start= i + 1; } else { sum += a[i]; } if(sum>maxsum) { maxsum = sum; //end = i; } //maxsum = max(maxsum, sum); } //cout<<"起始位置:"<<start<<",终止位置:"<<end; return maxsum; } int main() { int i; int arrlength; int arr[1000]; LL sum = 0,sum1,sum2; cout<<"请输入数组长度:"; cin>>arrlength; if(arr==NULL||arrlength==0) { //exit(1); return 0; } cout<<"请输入数组元素:"; for(i=0;i<arrlength;i++) { cin>>arr[i]; sum += arr[i]; } sum1 = maxsum(arr, arrlength); for(int i=0; i<arrlength; i++)//每个数求反 { arr[i] = -arr[i]; } sum2 = maxsum(arr, arrlength);//求出原数组中和小于0的元素的和 sum = max(sum + sum2, sum1);//sum+sum2数组两头的元素的和 cout<<"最大子数组的和为:"<<sum<<endl; return 0; }
四、结果截图
五、项目计划日志
周活动总结表
姓名:李俏 日期:2016年3月19日
日期 任务 | 听课 | 编写程序 | 阅读课本 | 准备考试 | 日总计 | ||
周日(3.20) | 30 | 30 | 60 | ||||
周一 | 120 | 30 | 30 | 180 | |||
周二 | 30 | 30 | 60 | ||||
周三 | 30 | 30 | 60 | ||||
周四 | 120 | 30 | 150 | ||||
周五 | 180 | 30 | 210 | ||||
周六 | 60 | 30 | 120 | ||||
周总结 | 240 | 360 | 210 | 810 |
六、时间记录表:
学生: 李 俏 日期 :2016年3月12日
教师: 王建民 课程 :软件工程
日期 | 开始时间 | 结束时间 | 中断时间 | 净时间 | 活动 | 备注 |
3.21 | 16:30 | 17:00 | 无 | 30 | 编写程序 | 作业 |
| 20:10 | 20:40 | 无 | 30 | 阅读 | 作业 |
3.22 | 19:10 | 19:50 | 10 | 30 | 编写程序 | 作业 |
| 20:00 | 20:30 | 无 | 30 | 阅读 | 作业 |
3.23 | 14:30 | 15:30 | 30min | 30 | 编写程序 | 作业 |
| 20:00 | 20:30 | 无 | 30 | 阅读 | 作业 |
3.24 | 18:50 | 19:20 | 无 | 30 | 编写程序 | 作业 |
| 20:00 | 20:30 | 无 | 30 | 阅读 | 作业 |
3.25 | 13:20 | 18:00 | 100 | 180 | 编写程序 | 作业 |
| 21:10 | 21:40 | 无 | 30 | 阅读 | 作业 |
3.26 | 12:00 | 13:30 | 30min | 60 | 编写程序 | 作业 |
七、缺陷记录日志:
学生 李俏,张莹荧
日期 2016年3月25日
教员 王建民
程序号 2
日期 | 编号 | 类型 | 引入阶段 | 排除阶段 | 修复时间 | 修复缺陷 |
3.26 | 1 | 函数 | 设计 | 编译 | 15min | |
描述:求最大子数组的和的函数封装不恰当 。 | ||||||
3.26 | 2 | 结果 | 编码 | 编译 | 15min | |
描述:没有考虑好最大子数组结果与其他元素的结果的关系 。 | ||||||
3.27 | 3 | 算法 | 编码 | 未 | ||
描述:无法返回位置。 |
八、工作照片
小伙伴:张莹荧(http://www.cnblogs.com/zhyying/)