结对开发:张哲 张晓菲
题目:返回一个数组中子数组最大和,数组可以首尾相连。
一、实验思路
本次实验在第一次的基础上增加了一些难度,数组可以首尾相连组成一个环,我们两个经过思考和讨论后得到一个方法:
1、在对环的特殊性研究后,我们可以将一个环拆成一个链,即:5 -1 3 3 拆成5 -1 3 3 5 -1 3 这个环每次从开始位置四个四个组队,即5 -1 3 3 、-1 3 3 5、3 3 5 -1、3 5 -1 3 ,然后利用for循环,计算其最大子数组和,这样即可以达到一个环所呈现的结果。
2、对于记录位置这个问题,我们定义了cstart start end三个变量来表示,cstart记录每次循环最大子数组和的位置,start记录最终最大子数组和的位置,end则记录最大子数组和终点的位置。
二、程序代码
1 //返回一个整数数组中最大子数组的和 2 //有正数、有负数、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和、将数组首尾相连、返回最大子数组的位置 3 //张哲、张晓菲 2016/3/22 4 5 #include<iostream> 6 using namespace std; 7 8 #define N 10000 9 int main() 10 { 11 int num, arr[N]; 12 int sum = 0; 13 cout << "请输入数组元素个数:"; 14 cin >> num; 15 cout << "请输入数组元素的值:"; 16 for (int i = 0; i<num; i++)//输入环状数组的元素值 17 { 18 cin >> arr[i]; 19 } 20 for (int i = num; i<(2 * num - 1); i++)//将环抻直,例如环状数组值原先为[A,B,C,D],那么抻直之后为[A,B,C,D,A,B,C] 21 { 22 arr[i] = arr[i%num]; 23 } 24 cout << "环抻直之后的数组相当于:" << endl; 25 for (int i = 0; i<(2 * num - 1); i++) 26 { 27 cout << arr[i] << " "; 28 } 29 cout << endl; 30 31 int max = arr[0]; 32 int end, start, cstart;//end为结束位置 start为起始位置 33 34 //求子数组最大和 35 for (int j = 0; j<num; j++) 36 { 37 sum = 0; 38 for (int i = j; i<j + num; i++) 39 { 40 if (sum <= 0) 41 { 42 sum = arr[i]; 43 cstart = i;//当前最大子数组的起始位置 44 } 45 else 46 sum = sum + arr[i]; 47 if (sum>max) 48 { 49 max = sum; 50 start = cstart; 51 end = i;//最大子数组的终止位置 52 } 53 } 54 } 55 cout << "子数组和的最大值为:" << max << endl; 56 cout << "最大子数组的起始位置为环抻直后的第" << start + 1 << "个元素,结束位置为环抻直后的第" << end+1 << "个元素。" << endl; 57 return 0; 58 }
三、实验结果截图
结果中给出了拆开后的数组,数组的位置从1开始,数组位置记录的是拆开后的位置。
四、时间记录日志
日期 | 开始时间 | 结束时间 | 中断时间(min) | 净时间(min) | 活动 | 备注 |
3月21号 星期一 | 14:00 | 15:50 | 10(课间) | 100 | 听课 | 软件工程 |
20:00 | 22:00 | 0 | 120 | 编程 | 一维数组1 | |
3月22号 星期二 | 19:50 | 20:40 | 0 | 50 | 编程 | 一维数组1 |
3月23号 星期三 | 15:00 | 14:00 | 10(休息) | 50 | 看书 | 构建之法 |
20:00 | 21:15 | 0(休息) | 75 | 编程 | 一维数组1 | |
3月24号 星期四 | 14:00 | 15:50 | 10(课间) | 100 | 听课 | 软件工程 |
20:30 | 22:00 | 10(休息) | 80 | 编程 | 一维数组2 | |
3月25号 星期五 | 16:30 | 17:00 | 0(休息) | 70 | 编程 | 一维数组2 |
21:00 | 22:00 | 0 | 60 | 编程 | 一维数组2 | |
3月26号 星期六 | 9:00 | 10:00 | 0 | 80 | 编程 | 一维数组2程序进行 修改、写博客 |