要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。
设计思路:随机生成一个数组,然后求其最大子数组,从第一个元素开始排列,然后第二元素排列,依次排列,因为要求的是首尾相连所以再次以第个元素为首元素循环n个元素形成一个指定数目的数组,然后开始筛选最大子数组。
程序代码:
#include<iostream>
using namespace std;
using namespace std;
void main()
{
int length; //数组的个数
int n; //数组变化后的长度
cout<<"请输入数组元素个数:"<<endl;
cin>>length;
n=2*length;
{
int length; //数组的个数
int n; //数组变化后的长度
cout<<"请输入数组元素个数:"<<endl;
cin>>length;
n=2*length;
int *a=new int[n]; //定义数组
cout<<"请输入数组的元素:"<<endl;
for(int i=0;i<length;i++)// for循环依次输入数组的元素
{
cin>>a[i];
}
int max=a[0]; // 首先定义max并且赋予第一个数组中的元素值
int s=0; //定义s值,s值为数组元素之和并且与max值比较
for( i=0;i<length;i++)
{
s=0;
for(int j=i;j<length+i;j++)
{
s=s+a[j];
if(s>max)
{
max=s;
}
}
a[length+i]=a[i];
}
cout<<endl;
cout<<"最大子数组的和为:"<<endl;
cout<<max<<endl;
}
cout<<"请输入数组的元素:"<<endl;
for(int i=0;i<length;i++)// for循环依次输入数组的元素
{
cin>>a[i];
}
int max=a[0]; // 首先定义max并且赋予第一个数组中的元素值
int s=0; //定义s值,s值为数组元素之和并且与max值比较
for( i=0;i<length;i++)
{
s=0;
for(int j=i;j<length+i;j++)
{
s=s+a[j];
if(s>max)
{
max=s;
}
}
a[length+i]=a[i];
}
cout<<endl;
cout<<"最大子数组的和为:"<<endl;
cout<<max<<endl;
}
运行结果:
![](https://img2018.cnblogs.com/blog/1499424/201811/1499424-20181104165953246-282669148.png)
心得体会:C语言基础太差,好多都是抄别人的代码,并且思绪很混乱,特别是这次作业首尾相连就是想不出来如何实现,以后要加强这方面的知识。
合作伙伴:鲁建伟
照片
![](https://img2018.cnblogs.com/blog/1499424/201811/1499424-20181104170746282-707938519.jpg)