求整数组环中最大子数组的和(升级版)

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

额外要求:让数组手尾相连,构成一个环,允许a[n],a[0]...这种形式。同时返回最大子数组的位置

设计思想:将环断开,成为一条线,分析这条线上的最大子数组,找到最大子数组,便可以找到最大子数组的起点和终点,然后将终点看作起点,将起点看作终点,将线连成环,在进行寻找最大子数组(寻找时不算上起点和终点),最后将先后找到的两个最大子数组连在一起就形成了这个整数组环的最大子数组,然后将记录的起点和终点输出出来,返回最大子数组的位置。

出现的问题:无法输入更多的数,例如1000个

可能的解决方案:定义更大范围的整形数组,但我用了 long,long long ,usinged long,usinged long long都不行

代码:

//吕广浩 3/27
#include<iostream>
#define n 100
using namespace std;
void main()
{
	int a[n], b[n][n];
	int length, i, j, w = 0, p = 0, q = 0, temp, m;
	cout << "输入随机整数" << endl;
	for (length = 0;;)
	{
		cin >> a[length];
		length++;
		if (getchar() == ‘\n‘)
		{
			break;
		}
	}
	cout << "这个数组的长度为:" << length << endl;
	//求子数组
	for (i = 0; i<length; i++)//两次循环,进行排除法,判断每个数所构成的最大子数组
	{
		m = i;
		w = 0;
		j = 0;
		while (j <= length - 1)
		{
			w += a[m];
			b[i][j] = w;
			m++;
			if (m>length - 1)
			{
				m = 0;
			}
			j++;
		}
	}

	temp = b[0][0];
	for (i = 0; i<length; i++)//将每个数对应的最大子数组进行判断,最后得到整个整数组的最大子数组
	{
		for (j = 0; j<length; j++)
		{
			if (b[i][j]>temp)
			{
				temp = b[i][j];
				p = i;
				q = j;
			}
		}
	}

	cout << "最大子数组的值为:" << temp << endl;
	cout << "最大子数组中元素的下标位子置:" << endl;
	i = 0;
	while (i <= q)
	{
		cout << p << "  ";
		p++;
		if (p >= length)
		{
			p = 0;
		}
		i++;
	}

	cout << endl;
}

  结果截图:

总结:这次程序思想很重要,由环到线,由平常到特殊,要考虑的情况也要全面。

时间: 2024-08-03 18:24:35

求整数组环中最大子数组的和(升级版)的相关文章

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

题目:返回一个二维整数组中最大子数组的和 实验思路 根据老师上课给出的3*6的数据 我们决定设计一个3*6行的二维数组进行计算,依次进行比较 将最大子数组的和返回 代码 1 #include <iostream.h> 2 int main() 3 { 4 int a[3][6];//定义一个3*6的二维数组 5 int max; 6 int s;//求和 7 int count; 8 int b[3][7]; 9 cout<<"请输入二维数组(3*6)中的元素:"

课堂练习求环整数组中最大子数组之和

设计思路:之前还有一个课堂练习,是用户输入一个整数组,求其中最大子数组之和,我借鉴的其他同学的代码,仅在此基础上修改的.运用try,catch使得用户不必在输入数组之前输入数组的长度,但是需要一个除整数以外的数来结尾.一共使用了3个循环,运用一个循环得出每个数组中最大子数组之和的最大值,一个是用来计算最大子数组之和,最后一个用来实现数组的前移.第一个循环中包着另外两个循环.总的来说,是在之前课堂练习的基础上增加了将一个数组中的每个数做一次最前面的数,从中求出最大值. 程序代码: 1 import

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

#include<iostream>using namespace std;int max(int a,int b){ if(a>b) {return a;}else{ return b;}}int maxsum(int a[],int n){ int i;int maxsofar=0;int maxendinghere=0;for (i=0;i<n;i++){maxendinghere=max(maxendinghere+a[i],0);maxsofar=max(maxsofar

Java实现:求子数组的最大和(数组)

求子数组的最大和(数组) 题目: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为 O(n). 例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,因此输出为该子数组的和 18. 解题思路: 我觉得用户关心的的数据有两个,一个是子数组的和,还有一个是子数组具体有哪些元素,所以我们可以封装一个子数组类SubArray,成员有子数据开

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

组员:刘伟 http://www.cnblogs.com/Lw-1573/p/5323542.html 1.题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 2.设计思想: 本题目最大的难点是如何找出子数组并且时间复杂度为O(n):我的思路是:从总左边(a[0])开始遍历整个数组,一直到最右边结束(a[n-1]),在这个过程中记录到目前

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

组员:刘伟 http://www.cnblogs.com/Lw-1573/p/5323542.html 1.要求: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大.同时返回最大子数组的位置.求所有子数组的和的最大值. 2分析: 这个题目是在上个题目的基础的加上数组首位相连,并该数组最大子数组的和,实现方法就是把环变成直线的方法,

求int型数组和最大子数组 续

之前的博文里已经实现过该程序的构思.编译.运行,本次就不再重复与之相雷同的内容. 题目:与别人借组,借助求int型数组最大和子数组的问题,考虑大数溢出和int取值范围的问题 要求: 调试程序  当子数组所含元素值超过int型数组取值范围时,会出现什么情况? 实现: 在接触到这个问题之前,肯定的说,我从来没有考虑过这个问题,不是自己不知道int型数值的取值范围,而是自己根本没有注意过这个问题,也没有想过数的取值会超过这个范围.知道这个“问题”后我做了下面的事情: a.和同学借组,查阅相关资料,了解

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

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

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

源程序: #include<iostream>#define n 100using namespace std;void main(){    int a[n], b[n][n]; int length, i, j, w = 0, p = 0, q = 0, temp, m;    cout << "输入随机整数" << endl;    for (length = 0;;)    {        cin >> a[length];