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

要求

1 要求程序必须能处理1000 个元素;
2 每个元素是int32 类型的;
3 输入一个整形数组,数组里有正数也有负数。
4 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
5 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
6 同时返回最大子数组的位置。
7 求所有子数组的和的最大值。要求时间复杂度为O(n)。

代码

#include<iostream>
#include<time.h>
#include<conio.h>
#define N 100000
using namespace std;
void RandIn(int IntNum,int A[])
{
	cout<<"整数"<<endl;
	for(int i=0;i<IntNum;i++)
	{
		A[i]=rand()-rand();
		cout<<A[i];	
		if(i%5==4)
			cout<<endl;
		else
			cout<<'\t';
	}
}
void SelMax(int IntNum,int A[],auto &sum)
{
	auto buffer=0;
	int count1=0;
	int count2=0;
	for(int j=0;j<=IntNum;j++)
	{
		if(j==IntNum)
		{
			j=0;
		}
		buffer+=A[j];
		count1++;
		count2++;
		if(buffer<0)
		{
			buffer=0;
			count1=0;
		}
		if(sum<buffer)
		{
			sum=buffer;
		}
		if(count1>IntNum||count2>IntNum*2)
		{
			break;
		}
	}
}
void main()
{
	
	int IntNum;
	int A[N];
	int q=0;
	while(q==0)
	{
		auto sum=0;
		srand((unsigned)time(NULL));
		cout<<"输入整数的个数:";
		cin>>IntNum;
		RandIn(IntNum,A);
		SelMax(IntNum,A,sum);
		cout<<endl;
		cout<<sum<<endl;
		cout<<"是否继续测试(输入0则继续)";
		cin>>q;
		system("cls");
	}
}
截图
设计思路
首先随机生成IntNum个正负数输出五列,引入一个常量记录累加的和,buffer进行求和的数值个数,for语句进行的运算次数,如果累加和小于0,buffer重新初始化为0,sum始终记录下存在的最大和,为了数组允许首尾相连和最大的情况,如果累加数count1超过IntNum跳出循环,或者语句进行的运算次数超出数组数值的两倍
设计过程
由另一名同学提供了设计思路及其解决数据首尾相连和最大值的情况,我根据其思路设计出程序,最后由其检校,中间也遇到了一些困难,但是也被我们一一解决了
合作照片
 

猜你喜欢

转载自www.cnblogs.com/qingjia/p/9904227.html