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

开始时间: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,会出现以下情况:

总结

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

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

小组成员合照

原文地址:https://www.cnblogs.com/pcyyyyy/p/9787074.html

时间: 2024-10-01 08:04:53

返回一个整数数组最大子数组的和的相关文章

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

返回一个整数数组(环形数组)中最大子数组的和

一.实验题目 题目:返回一个整数数组中最大子数组的和. 要求:      输入一个整形数组,数组里有整数也有负数.      数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.      如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],……A[n-1],A[0]……A[j-1]之和最大.      同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 二.实验思路 由于这次所要求的子数组相当于一个环形的数组,所以就想到了类似数字右循环的形式来

软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)

题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为O(n): 一.设计思想 1.首先随机产生一个数组,数组长度可自行输入,该数组里有正数也有负数. 2.从数组中第一个元素a[0]开始,依次计算a[0].a[0]+a[1].a[0]+a[1]+...+a[i]的值,即从a[0]开始的每个子数组的和,取出最大值. 3.再从数组第二个元素a[1]开始,依

返回一个整数数组中最大子数组的和(加强版)

题目:返回一个整数数组中最大子数组的和 要求:让数组手尾相连,构成一个环,同时返回最大子数组的位置 设计思想: 1.将环断开,成为一条线,分析这条线上的最大子数组,找到最大子数组,便可以找到最大子数组的起点和终点. 2.然后将终点看作起点,将起点看作终点,将线连成环,在进行寻找最大子数组(寻找时不算上起点和终点). 3.最后将先后找到的两个最大子数组连在一起就形成了这个整数组环的最大子数组,然后将记录的起点和终点输出出来,返回最大子数组的位置. 源代码: #include<iostream>

返回一个整数数组中最大子数组的和之测试

题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 考虑到手动输入1000个元素所以在程序中由系统随机出1000个元素进行测试.代码与之前的代码差别不大. 程序代码: 1 #include <iostream.h> 2 #include<stdlib.h

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

题目:返回一个整数数组中最大子数组的和3 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 思路: 代码: 截图: 总结:

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

题目:返回一个整数数组中最大子数组的和2 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 思路: 代码: 截图: 总结:

结对开发之《返回一个整数数组中最大子数组的和》

一.题目: 返回一个整数数组中最大子数组的和. 要求: 1.输入一个整形数组,数组里有正数也有负数. 2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 3.求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思路 1.定义一个大小为10的数组,接受任意十个自然正数: 2.分别将连续的一个数,两个数,......,组合成子数组,分别求出包含一个元素的数组的最大值,两个元素的,三个元素的,......,然后再比较这十组的值,求出最大值,即为所求: 3.单独判断一些特殊的

返回一个整数数组中最大子数组的和(2)

题目:返回一个整数数组中最大子数组的和 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 在做前面一道题目时,并没有考虑数组个数的上限及随机数位数问题,以为是要程序不出错,就是完美的.而通过课堂上验证上次程序,发现数组的和超过某一值时,将不会显示,但同样,程序不会报错,在小程序中后果并不严重,但是一旦开发大型

返回一个整数数组中最大子数组的和(数组头尾连接)

1.题目. 题目:返回一个整数数组中最大子数组的和.要求:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大.同时返回最大子数组的位置.求所有子数组的和的最大值.要求时间复杂度为O(n). 2.设计思路. 将随机产生的数连续的存入数组两次,在从第一个开始,分别求出它所有子数组的和,进行比较.求出最大最大子数组. 3.代码. #i