数组练习2

 结对开发:张哲  张晓菲

题目:返回一个数组中子数组最大和,数组可以首尾相连。

一、实验思路

   本次实验在第一次的基础上增加了一些难度,数组可以首尾相连组成一个环,我们两个经过思考和讨论后得到一个方法:

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  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程序进行

修改、写博客

原文地址:https://www.cnblogs.com/zz0906/p/5322030.html