结队开发5----首尾相连数组

结队成员:范德一,赵永恒

一.题目

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

要求:

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

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

如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。

同时返回最大子数组的位置。

求所有子数组的和的最大值。要求时间复杂度为O(n)

二.设计思路

我们在上次实验的基础上,通过在原有的循环体的最外边再添加了一个循环条件,这个循环条件是在第一次循环之后,将数组中每个数的值赋给它前面一个数,这样在最后一次循环的时候就实现了首尾相连。

三.实验代码

#include<iostream.h>
#include<time.h>
#include<stdlib.h>

int main()
{
	int a[10];
	int m;              //m是每组个数
    int *sum=new int[10];
		srand((unsigned)time(NULL));
	cout<<"*********************************"<<endl;
	for(int i=0;i<10;i++)
	{  
		int b;
	    b=rand()%2;
	    switch (b)
		{
        	case 0:
		            a[i]=rand()%100;
		            break;
	        case 1:
		            a[i]=-rand()%100;
		            break;
		}
	    cout<<a[i]<<"   ";
	   /* if((i%10)==4)
		cout<<endl;   */      //每行10个输出,换行
	
	}
	
	cout<<"*********************************"<<endl;
	int he=0;
for(int t=1;t<11;t++)
{
	for(m=1;m<11;m++)
	{
		int temp=0;
		for(int n=0;n<m;n++) 
		{
			temp=temp+a[n];
		}
		for(int k=0;k<=(10-m);k++)
		{
			sum[k]=0;
			for(int j=k;j<(k+m);j++)  //a[k]是每组第一个数
			{
				sum[k]=sum[k]+a[j];
			}
			if(sum[k]>temp)
			{
				temp=sum[k];	
			}	
		}
        if(temp>he)
		{
			he=temp;
		}

	}
    int temp1=0;
	temp1=a[0];
	a[0]=a[1];
	a[1]=a[2];
	a[2]=a[3];
	a[3]=a[4];
	a[4]=a[5];
	a[5]=a[6];
	a[6]=a[7];
	a[7]=a[8];
	a[8]=a[9];
	a[9]=temp1;
}
	cout<<"最大子数组的和为: "<<he<<endl;
	cout<<"*********************************"<<endl;
	return 0;
}

四.运行截图

五.实验感想

关于数组的实验这已经是第四次进行扩展了,现在回想一下,每一次的实验都有一个上一次的基础,第一次实验比较简单,我们也很容易就做了出来,然后在这个第一次实验的基础上,我们一次又一次的加深难度,逐步实现了不同的功能;倘若我们第一次实验的内容就是这样的话,我们肯定不会这么容易完成,这让我再一次体会到了把大目标分解成小目标的好处。

原文地址:https://www.cnblogs.com/myblog1993/p/4378391.html