返回一个整数数组中最大子数组的和
题目要求:
1:输入一个整形数组,数组里有正数也有负数。
2:数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3:如果数组A[0]......A[j-1]首尾相邻,允许A[i-1],......A[n-1],A[0]......A[j-1]之和最大。
4:同时返回最大子数组的位置。
5:求所有子数组的和的最大值。
实验思路:
首先用求解整数组的方法,求解最大子数组的和,然后将第一个数放在最后一个数后面,形成一个新的数组,继续进行求解,而这就需要定义长为两倍数组的一个整数组,每求出一个和将第一个数放最后,实验循环下来才可以求得,再依次找到子数组中元素的位置。
运行代码:
#include<iostream>
#include<time.h>
#define n 10
using namespace std;
void main()
{
int a[n],i,j,w=0,b[n][n],p1=0,p2=0,t,m;
srand((int)time(0));
for(i=0;i<n;i++)
{
a[i]=-rand()%36+25;
}
for(i=0;i<n;i++)
{
cout<<a[i]<<endl;
}
for(i=0;i<n;i++)
{
m=i;
w=0;
j=0;
while(j<=n-1)
{
w+=a[m];
b[i][j]=w;
m++;
if(m>n-1)
{
m=0;
}
j++;
}
}
t=b[0][0];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(b[i][j]>t)
{
t=b[i][j];
p1=i;
p2=j;
}
}
}
cout<<"最大子数组的值为:"<<t<<endl;
cout<<"子数组中元素的位置为:"<<endl;
i=0;
while(i<=p2)
{
cout<<p1<<" ";
p1++;
if(p1>=n)
{
p1=0;
}
i++;
}
cout<<endl;
}
#include<time.h>
#define n 10
using namespace std;
void main()
{
int a[n],i,j,w=0,b[n][n],p1=0,p2=0,t,m;
srand((int)time(0));
for(i=0;i<n;i++)
{
a[i]=-rand()%36+25;
}
for(i=0;i<n;i++)
{
cout<<a[i]<<endl;
}
for(i=0;i<n;i++)
{
m=i;
w=0;
j=0;
while(j<=n-1)
{
w+=a[m];
b[i][j]=w;
m++;
if(m>n-1)
{
m=0;
}
j++;
}
}
t=b[0][0];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(b[i][j]>t)
{
t=b[i][j];
p1=i;
p2=j;
}
}
}
cout<<"最大子数组的值为:"<<t<<endl;
cout<<"子数组中元素的位置为:"<<endl;
i=0;
while(i<=p2)
{
cout<<p1<<" ";
p1++;
if(p1>=n)
{
p1=0;
}
i++;
}
cout<<endl;
}
运行结果
小组成员(李鹏)