结对开发-- 循环一维数组求和最大的子数组

本文介绍了一个通过数组叠加并利用循环结构求解子数组最大和的小程序。该程序首先生成一组-10到10之间的随机数,然后通过复制数组形成循环结构,并运用动态规划的思想计算不同长度子数组的最大和。

一、设计思路

1.数组叠加凑成循环,再套用以前求最大值的代码实现。

二、源代码

#include<iostream.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	cout<<"---------------------求数组中子数组和的最大值的小程序----------------------"<<endl;
	cout<<endl;
	int a[5];
	int c[5];
	int b[10];
	int i;
    srand( (unsigned)time( NULL ) );//随机数种子为当前计算机时间。
	for(i=0;i<5;i++)
	{
		a[i]=rand()%22-11;//得到一组-10到10的整数;
		cout<<a[i]<<"\t";
	}
	cout<<endl;
	for(i=0;i<9;i++)
	{ 
	    if(i<5)
			b[i]=a[i];
		else
			b[i]=a[i-5];
	//cout<<b[i]<<"\t";
	}
	cout<<endl;
	//最大值求法
	int sum=0;  
    int GreateSum=0; 
	//1-5
	for ( i=0;i<5;i++)  
	{  
		sum+=b[i];  
		if (sum<0)  
		{  
			sum=0;  
		}  
		if (sum>GreateSum)  
		{  
			GreateSum=sum; 
		}
	}  
	if (GreateSum==0)  
	{  
		for (int i=0;i<5;i++)  
		{  
			if (GreateSum==0)  
			{  
				GreateSum=b[i];  
			}  
			else  
				if (GreateSum<b[i])  
				{  
					GreateSum=b[i];
				}  
		}  
	}
	c[0]=GreateSum;
	//2-6
	sum=0;  
    GreateSum=0; 
	for ( i=1;i<6;i++)  
	{  
		sum+=b[i];  
		if (sum<0)  
		{  
			sum=0;  
		}  
		if (sum>GreateSum)  
		{  
			GreateSum=sum;  
		}
	}  
	if (GreateSum==0)  
	{  
		for (int i=1;i<6;i++)  
		{  
			if (GreateSum==0)  
			{  
				GreateSum=b[i];  
			}  
			else  
				if (GreateSum<b[i])  
				{  
					GreateSum=b[i];  
				}  
		}  
	}
	c[1]=GreateSum;
	//3-7
	sum=0;  
    GreateSum=0; 
	for ( i=2;i<7;i++)  
	{  
		sum+=b[i];  
		if (sum<0)  
		{  
			sum=0;  
		}  
		if (sum>GreateSum)  
		{  
			GreateSum=sum;  
		}
	}  
	if (GreateSum==0)  
	{  
		for (int i=2;i<7;i++)  
		{  
			if (GreateSum==0)  
			{  
				GreateSum=b[i];  
			}  
			else  
				if (GreateSum<b[i])  
				{  
					GreateSum=b[i];  
				}  
		}  
	}
	c[2]=GreateSum;
	//4-8
	sum=0;  
    GreateSum=0; 
	for ( i=3;i<8;i++)  
	{  
		sum+=b[i];  
		if (sum<0)  
		{  
			sum=0;  
		}  
		if (sum>GreateSum)  
		{  
			GreateSum=sum;  
		}
	}  
	if (GreateSum==0)  
	{  
		for (int i=3;i<8;i++)  
		{  
			if (GreateSum==0)  
			{  
				GreateSum=b[i];  
			}  
			else  
				if (GreateSum<b[i])  
				{  
					GreateSum=b[i];  
				}  
		}  
	}
	c[3]=GreateSum;
	//5-9
	sum=0;  
    GreateSum=0; 
	for ( i=4;i<9;i++)  
	{  
		sum+=b[i];  
		if (sum<0)  
		{  
			sum=0;  
		}  
		if (sum>GreateSum)  
		{  
			GreateSum=sum;  
		}
	}  
	if (GreateSum==0)  
	{  
		for (int i=4;i<9;i++)  
		{  
			if (GreateSum==0)  
			{  
				GreateSum=b[i];  
			}  
			else  
				if (GreateSum<b[i])  
				{  
					GreateSum=b[i];  
				}  
		}  
	}
	c[4]=GreateSum;
	for(i=0;i<5;i++)
	{
		//cout<<c[i]<<"\t";
		if(GreateSum<c[i])
		{
			GreateSum=c[i];
		}
	}
	cout<<endl;
	cout<<"最大子数组和的值为:"<<GreateSum<<endl;
	return 0;
}

  三、运行截图

四、心得体会

套用以前代码感觉省事,因为许多变量都注释,结构也清晰。主要是子数组位置尚未实现,有待修改。其次写完感觉程序有缺陷,扩展性不好,数组范围有限制。

转载于:https://www.cnblogs.com/dlyxx/p/4377731.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值