求最大子数组第二部


一、题目要求:返回整数数组中最大的子数组的和


输入一个整形数组,数组里有正数也有负数。


数组中连续的一个或多个整数组成一个数组,每个子数组都有一个和。


将数组连成环求最大的数组。


二、设计思路:


这次实验是在上次实验的基础上做的,要将数组组成一个环的话这次实验只需要将数组的内容复制一遍,将数组数量由原来的N变为N+N,定义j用它来保存数组开始的位置数组结束的位置为N+j;定义Array_max[]记录,每一个圆环中的最大的子数组之和,运行结束后,比数组中的最大的数值并输出;其中大数组的保存和输出只需要加上


long long Array_max[1000]


用来生成32位数组:


Array_a[i]=(RAND16 << 16) + RAND16;

三、代码:


 1 #include<iostream>
 2 #include<time.h>
 3 #define RAND16 ((rand()<<1) + (rand()&1))
 4 using namespace std;
 5 int main()
 6 {   
 7     srand(time(0));
 8     _int32 Array_a[2000];
 9     long long Array_max[1000];//存放每个子数组的最大数组之和
10     long long arrayOfmax;//存放最后结果最大数
11     int N;//随机生成数组元素个数
12     N=rand()%1000+1;
13     cout<<"The number of array:"<<N<<endl;
14     for(int i=0;i<N;i++)
15     {
16         Array_a[i]=(RAND16 << 16) + RAND16;//生成32位数组元素
17     }
18     //将数组复制一遍加宽数组的长度
19     for(int i=0;i<N;i++)
20     {
21         Array_a[N+i]=Array_a[i];
22     }
23     for(int i=0;i<N;i++)
24     {
25         cout<<Array_a[i]<<"  ";
26         if((i+1)%5==0){cout<<endl;}
27     }
28     cout<<endl;
29     //求每个圆环的N个数组的最大的子数组
30     for(int j=0;j<N;j++)
31     {
32         
33         long long max=0;
34         long long sum=0;
35         for(int i=j;i<(N+j);i++)
36        {
37           sum+=Array_a[i];//将每位求和赋给sum
38            if(Array_a[i]>=0)
39           {
40              if(max<sum)
41             {
42                max=sum;
43             }
44 
45           }
46              if(sum<0)
47             {
48                sum=0;
49              }
50        }
51         if(max==0)
52         {
53             max=Array_a[0];
54            for(int i=j;i<N+j;i++)
55           {
56             if(Array_a[i]>max)
57              max=Array_a[i];
58           }
59         }
60         Array_max[j]=max;    
61   }
62     cout<<"The max array is:";
63     arrayOfmax=Array_max[0];
64     for(int k=1;k<N;k++)
65     { 
66         if(arrayOfmax<Array_max[k])
67         {
68             arrayOfmax=Array_max[k];
69         }
70     }
71     cout<<arrayOfmax<<endl;
72 return 0;
73     
74 }



四、 截图:
五、 体会:这次实验是在第一次的基础上实现的,只需要做一些小小的改动,用循环来实现就能成功,但是这次实验开始运行还是有很多问题,经过队友的查看发现只是大括号的位置放错了,还是有一些小马虎。~~~~(>_<)~~~~

六、项目计划日志(单位:h)

 

听课

编写程序

阅读相关书籍

网上查找资料

日总计

周一

2

0

0

0

2

周二

0

3

0

0.5

3.5

周三

0

3

1

0

4

周四

2

4

0

0

6

周五

0

4

1

1

6

周六

0

3

0

0

3

周日

0

2

0

0

2

周总计

4

19

2

      1.5

26.5

七、时间记录日志:(单位:min):

日期

开始时间

结束时间

中断时间

净时间

活动

备注

星期一

14:00

15:50

10

100

听课

软件工程

星期二

19:00

22:00

0

180

网上查找资料 编写程序

求最大的数组

星期三

15:00

18:00

0

180

编程和上网查找资料并且调试程序

结对编程

19:00

20:00

0

60

读书

构建之法

星期四

14:00

15:50

10

100

听课

软件工程

19:00

23:00

0

240

编程

求最大数组

星期五

16:00

21:00

60

240

编程上网查找资料

结对编程

21:30

22:30

0

60

看书

构建之法

星期六

19:00

22:00

0

180

编程和写博客

求最大数组2

星期日

19:00

20:00

0

120

编写程序和写博客

求最大数组2

八、缺陷记录日志:

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

3/23

1

20

编码

调试

20:00

括号输出错误,运算不正确

3/24

2

20

编码

调试

19:00-23:00

程序的正确结果数不出来,计算求和不正确,因为将最后的计算和放到大括号里边了

3/26

3

20

编码

调试

10:00

括号的丢失和语法的错误。

3/27

4

20

编码

调试

19:00

程序最后的位置输出不成功

原文地址:https://www.cnblogs.com/lvlan/p/5326741.html