//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);
}
}