求固定数组的最大子数组

一、设计思路 

  先将一个数组赋初值为从零开始按加一递增的子数组的和,之后将求解分为三层,即三个for循环,最里边一层求子数组的和,将各个个数相同的子数组中最大的赋给另一个数组,第二层决定子数组的位置,第三层决定子数组的个数。最后将得到的子数组进行大小比较,输出。

二、代码

 1 //刘双渤,2015年3月20日,最大子数组求和
 2 #include <iostream>
 3 using namespace std;
 4 
 5 void main()
 6 {
 7     int a[10],b[10],c[10];
 8     int min,max;
 9     int i,t,k,S,bmax,bmaxi,C;
10     //输入
11     cout<<"请输入两个数确定数组中值的取值范围(确保前一个整数小于后一个整数):"<<endl;
12     cin>>min>>max;
13 
14     for(i=0;i<10;i++)
15         a[i]=min+rand()%(max-min);
16 
17     cout<<"此随机大小为10的随机数组为:"<<endl;
18     for(i=0;i<10;i++)
19         cout<<a[i]<<" ";
20 
21     cout<<endl;
22 
23     for(i=0;i<10;i++)                //将b[10]初值均赋为0
24         b[i]=0;
25 
26     t=1;
27     for(i=0;i<10;i++)                //将b[10]初值按从a[0]开始依次增加的子数组和分别赋值
28     {
29         for(k=0;k<t;k++)
30             b[i]+=a[k];
31         t++;
32     }
33 
34     S=0;
35     for(t=0;t<10;t++)               //求出各个数目的子数组中最大值
36     {
37         for(i=0;i<10-t;i++)
38         {    
39             for(k=0;k<t+1;k++)
40                 S+=a[i+k];
41             if(b[t]<=S)
42             {
43                 b[t]=S;
44                 c[t]=i;
45             }
46             S=0;
47         }
48     }
49 
50     bmax=b[0];
51     for(i=0;i<10;i++)                //求出最大的子数组和其所在位置
52     {
53         if(bmax<=b[i])
54         {
55             bmax=b[i];
56             bmaxi=i;
57         }
58     }
59     //输出
60     cout<<"最大子数组和为:"<<endl;
61     cout<<bmax<<endl;
62     cout<<"最大子数组为:"<<endl;
63     C=c[bmaxi];
64     for(i=0;i<bmaxi+1;i++)
65     {
66         cout<<a[C+i]<<"\t";
67     }
68     cout<<endl;
69 }

 

三、设计过程
  这个代码实现的过程最大时间复杂度为n3,一开始的思路混乱,之后将求最大的子数组的过程按最寻常的思路进行一步步分解,得到了如上的设计思路。初次调试时,无法输出最大数组和和最大子数组,便进行断点调试,发现第35行开始t的变化的错误。解决t的问题后,调试负数范围,发现不能输出最大子数组,却可以输出最大子数组的和,修改53行后解决。在不断用相同值调试中发现,每次产生的数组内的随机数不相同,但每个数组都相同,原来是缺少时间的限制,这样以前的的几个随机数的程序也就犯了相同的错误,以后避免此错误的发生。

四、实验结果

 

五、进度计划

日期

计划小时数

累计小时数

实际小时数

累计实际小时数

PV

累计PV

EV

累计EV

3/22

1

2

2.3

 

 

 

 

 

 

六、时间记录日志

 

学生  **                           日期  2015/3/23

教师  **                           课程  软件工程

日期

开始时间

结束时间

中断时间

净时间

活动

备注

3/23

4:10

6:30

 

140

编程

 

七、缺陷记录日志

学生 刘**

日期 2015/3/23

教员 王**

程序号 01

日期

编号

类型

引入阶段

排除阶段

修复阶段

修复缺陷

3/23

1

 

调试

编译

 

 

描述:参数“t”值的变化错误

 

2

 

调试

编译

 

 

描述:应将“<”改为“<=”以确定值的赋值的正确

posted on 2015-03-23 19:27  的小逸  阅读(252)  评论(1编辑  收藏  举报