结对项目3

题目:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。 求所有子数组的和的最大值。
设计思想:
1.确定一个数组a[n]
2.先用双重循环,求出子数组的和
第一次以数组的第一个元素为字数组的第一个元素,依次往下加,直到数组最后一个元素
第二次以数组的第二个元素为字数组的第一个元素,再依次往下加,原来数组的第一个元素设置为最后一个元素(PS:利用不超过原数组长度实现)
以此类推,直到原数组最后一个元素。形成循环数组
3.用一个二维数组b[][]存放每个子数组的和
4.再利用双重循环比较数组b中元素的大小得到原数组a的最大子数组和以及元素下标

出现的问题:如果超过十个数,程序不再记录第十个元素之后的数
解决方案: 在源程序中修改n值或者不再手动输入直接自动生成数组
srand((int)time(0));
for(i=0;i<n;i++)
{
a[i]=-rand()%36+25;
}
源代码:
#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;
cout<<"请输入10个整数:\n";
for(i = 0; i < 10; i++)//输入
{
cin>>a[i];
}

//输出数组的元素值
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;
}

结果截图

总结:

实现一个目的时,先拆分为小的可以实现的目标

思考一个目的的实现,找到他的关键是什么,边练习边学习。遇到不会的时候要能尽自己的努力查找资料,理解资料转化为自己的东西

猜你喜欢

转载自www.cnblogs.com/tu1603liwen/p/9904928.html