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

本文介绍了一种解决环形数组中寻找最大子数组及其位置的方法,通过将环形数组转换为线性数组来简化问题,并给出了具体的实现代码。

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

额外要求:让数组手尾相连,构成一个环,允许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;
}

  结果截图:

开发流程:

日期和任务听课看书网上查资料编程日总计
周一2 013
周二    0
周三 2 13
周四2 2 4
周五 1113
周六  336
周日     
总计436619

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

缺陷记录日志:未考虑数值超出范围是的情况

转载于:https://www.cnblogs.com/lvstudy/p/5324948.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值