返回一个整数数组最大子数组的和

开始时间:14:00

结束时间:17:   20

要求

1,程序可以处理1000个元素;

2,每个元素是int32类型的;

3,整型数组有正数也有负数;

4,可以求出所有子数组的和的最大值,时间复杂度为O(n)

 5,小组成员:于芳娜,张素颖

设计思路

1,

如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常进憾的是,由于长度为n的数组有O(n^2)个子数组,而且求一个长度为n的数组的和的时间复杂度为O(n).

因此这种思路的时间是O(n^3).

2,

很容易理解,当我们加上一个正数时,和会增加,当我们加上一个负数时,和合减少,如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零。

不然的话这个负数将会减小接下来的和。

3,

调用随机函数rand(),srand()生成随机数组。

 

1 //2018.10.14
 2 //组内成员:于芳娜,张素颖
 3 //返回一个整数数组最大子数组的和
 4 #include<iostream>
 5 #include<time.h>
 6 #include<stdlib.h>
 7 using namespace std;
 8 int MaxSum(int data[],int length,int &start,int &end)
 9 {
10     int max=data[0];
11     int starttemp=0,endtemp=0;//定义开始和结束位置
12     int cursum=0;//定义元素和
13     if(data==NULL||length<0)
14     {
15        return 0;
16     }//数组为空的处理
17     for(int i=0;i<length;i++)
18     {
19         if(cursum<=0)//数组元素和小于零时,重置为第i个元素
20         {
21             cursum=data[i];
22             starttemp=i;
23             endtemp=i;
24         }
25         else
26         {
27             cursum+=data[i];//数组元素大于零时,累加
28             endtemp=i;
29         }
30         if(cursum>max)//当前和大于最大和,则重置最大和
31         {
32             max=cursum;
33             start=starttemp;//子数组元素开始及结束位置
34             end=endtemp;
35         }
36     }
37         return max;
38 }
39 int main()
40 {
41     int n;
42     cout << "Number of elements in array:" << endl;
43     cin >> n;
44     srand((unsigned)time(NULL));//实现不同随机数的生成
45     int data[n];
46     {
47         for(int j=0;j<n;j++)
48         {
49             data[j]=rand()%2001-1000;
50             cout<<data[j]<<" ";
51         }//输出-1000到1000的1000个随机数
52     }
53     int length=sizeof(data)/sizeof(int);//数组长度计算
54     int start=0,end=0;
55     int result=MaxSum(data,length,start,end);//调用函数
56     cout << endl;
57     cout<<"MaxOfSubarrays="<<endl;
58     for(int i=start;i<=end;i++)
59         cout<<data[i]<<" ";//输出最大子数组
60     cout<<endl;
61     cout<<"MaxSumOfSubarrays="<<" "<<endl;
62     cout<<result<<endl;//输出最大子数组的和
63     return 0;
64 }

设计过程中遇到的问题

1,初始阶段,没有明确的设计思路可以将最大子数组的和表示出来,以至于设计出的代码仅仅只适用于一两个数组,不能做到很好的泛化。

解决方案:查阅并借鉴相关资料,完善自己的设计思路。

2,随机数的生成过程之中,不知道生成负的随机数的方法

解决方案:查阅并借鉴相关资料,扩大了生成随机数的范围。

3,代码写完之后存在多处运行错误

解决方案:逐一调试。

 

运行截图

 

 

 

对于子数组之和大于整型表示的最大范围时出现情况的观察

 

 把生成随机数的位数放大至1*10^20---2*10^20,会出现以下情况:

 

 

 

 总结

 这是第一次由两个人共同完成一个编程,在编程过程之中分工明确,共同解决一些技术上的难题,体会到对各种函数的使用和编写还不是特别熟练,容易出现卡壳现象,

今后会多读一些程序代码,提高自己的编程能力。

小组成员合照

posted @ 2018-10-14 17:35  pcyzsy  阅读(115)  评论(0编辑  收藏  举报