一维子数组成环后最大子数组的和
组成员:
姜中希 王召博
设计思想(在后来实现过程中有改进):
(1) 外层while循环控制结束(i=n)的时候停止。
(2) 内层计算:按照不循环数组的方式计算,每当外层i增加1,数组更新,
第i-1个数变为数组的第n个数,第i个数变为数组的第一个数,并进行
最大子数组的和的求解。并将最大子数组的开头位置坐标记录入一个数组中,
每次计算的最大和也存入一个数组中,最后进行比较得到最大和以及和最大子的数组的开头位置坐标。
源代码:
(1) 外层while循环控制结束(i=n)的时候停止。
(2) 内层计算:按照不循环数组的方式计算,每当外层i增加1,数组更新,
第i-1个数变为数组的第n个数,第i个数变为数组的第一个数,并进行
最大子数组的和的求解。并将最大子数组的开头位置坐标记录入一个数组中,
每次计算的最大和也存入一个数组中,最后进行比较得到最大和以及和最大子的数组的开头位置坐标。
源代码:
//2015/4/4
#include<iostream>
using namespace std;
void max(int l,int *a)//当元素不全为负数的情况
{
int sum=0,j,p;
for(int m=0;m<l;m++)//控制首元素是那一个
{
p=0;
for(int i=m;i<l+m;i++)//控制比较的数组大小始终为l
{
if(p<0)
{
p=a[i];
}
else
{
p=p+a[i];
}
if(sum<p)
{
sum=p;
j=i; //记录下当前最大子数组的最后一个元素的坐标
}
}
}
cout<<"最大子数组的和为:"<<sum<<endl;
cout<<"最大子数组的元素位置为(从后往前输出):"<<endl;
p=0,sum=0;
int flag;
for(int i=j-l+1;i<=j;i++)
{
if(a[i]>0)
{
flag=i;
break;
}
}
for(int i=j;i>=flag;i--)//从最后元素一个往前找寻找范围是l结果是从j到j-l+1范围内最大子数组的所有元素的下标
{
if(p<0)
{
p=a[i];
}
else
{
p=p+a[i];
cout<<i%l+1<<" ";
}
if(sum<p)
{
sum=p;
}
}
cout<<endl;
}
void main()
{
int n,count=0,mx;
cout<<"请输入数组的长度:";
cin>>n;
int *a=new int[2*n];//申请一个动态数组数组的长度为2n
cout<<"请输入数组元素:";
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]<0)
{
count++;
}
}
if(count==n)//当数组元素全是负数的情况只需比较单个元素的大小并记下坐标
{
mx=a[0];
int c=0;
for(int i=1;i<n;i++)
{
if(a[i]>mx)
{
mx=a[i];
c=i;
}
}
cout<<"最大子数组的和为:"<<mx<<endl;
cout<<"最大和子数组的位置是:"<<c+1<<endl;
}
else
{
for(int i=n;i<2*n-1;i++)
{
a[i]=a[i-n];//将输入的数组元素在此数组中存放两边但第二遍不用存最后一个因为用不着从而成为环
}
for(int i=0;i<2*n-1;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
max(n,a);
}
}
#include<iostream>
using namespace std;
void max(int l,int *a)//当元素不全为负数的情况
{
int sum=0,j,p;
for(int m=0;m<l;m++)//控制首元素是那一个
{
p=0;
for(int i=m;i<l+m;i++)//控制比较的数组大小始终为l
{
if(p<0)
{
p=a[i];
}
else
{
p=p+a[i];
}
if(sum<p)
{
sum=p;
j=i; //记录下当前最大子数组的最后一个元素的坐标
}
}
}
cout<<"最大子数组的和为:"<<sum<<endl;
cout<<"最大子数组的元素位置为(从后往前输出):"<<endl;
p=0,sum=0;
int flag;
for(int i=j-l+1;i<=j;i++)
{
if(a[i]>0)
{
flag=i;
break;
}
}
for(int i=j;i>=flag;i--)//从最后元素一个往前找寻找范围是l结果是从j到j-l+1范围内最大子数组的所有元素的下标
{
if(p<0)
{
p=a[i];
}
else
{
p=p+a[i];
cout<<i%l+1<<" ";
}
if(sum<p)
{
sum=p;
}
}
cout<<endl;
}
void main()
{
int n,count=0,mx;
cout<<"请输入数组的长度:";
cin>>n;
int *a=new int[2*n];//申请一个动态数组数组的长度为2n
cout<<"请输入数组元素:";
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]<0)
{
count++;
}
}
if(count==n)//当数组元素全是负数的情况只需比较单个元素的大小并记下坐标
{
mx=a[0];
int c=0;
for(int i=1;i<n;i++)
{
if(a[i]>mx)
{
mx=a[i];
c=i;
}
}
cout<<"最大子数组的和为:"<<mx<<endl;
cout<<"最大和子数组的位置是:"<<c+1<<endl;
}
else
{
for(int i=n;i<2*n-1;i++)
{
a[i]=a[i-n];//将输入的数组元素在此数组中存放两边但第二遍不用存最后一个因为用不着从而成为环
}
for(int i=0;i<2*n-1;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
max(n,a);
}
}
{
mx
屏幕截图:
![](http://images0.cnblogs.com/blog2015/719296/201504/151642333542776.png)
![](http://images0.cnblogs.com/blog2015/719296/201504/151641592606657.png)
![](http://images0.cnblogs.com/blog2015/719296/201504/151631225578774.png)
总结:
首先我觉得用把数组再储存一遍看成环是个不错的想法,再就是要有欢迎错误的想法,当别人给自己指出错误或者可以改进的地方时不仅是自己的程序更加趋于完美,个人的能力和对于学习的态度也随之提高,最后就是环是对结队开发时任务分配感觉力不从心我不知道应该如何协调俩人的任务,可肯定有结对开发提高效率的方法,不然怎么会有那些成功的例子 ,需要在这方面提高。