您的位置:首页 > 其它

课堂练习----一个整数数组中最大子数组的和(2)

2016-03-27 16:46 295 查看
本次的题目是:返回一个整数数组中最大子数组的和

要求:

输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。

同时返回最大子数组的位置。

求所有子数组的和的最大值。

分析:

这个题目是在上个题目的基础的加上数组首位相连,并该数组最大子数组的和,实现方法就是把环变成直线的方法,通过for循环,在每次循环中,把数组中的元素作为数组的起始位置,并把后面的元素依次放到另外一个数组中。对于新生成的数组,通过上一次的方法求出新数组的最大子数组的和,然后通过比较所有数组的最大子数组和,求出初始数组最大子数组的和。

2 4 7 -10

4 7 -10 2

7 -10 2 4

-10 2 4 7

代码:

#include<iostream>
using namespace std;
#define N 100
int main()
{
int p,num,value,max,count=0;
int val
;                                      //原始数组
int Array
;                                      //存放新生成的数组
int ArrayMax
;                                   //存放每个数组最大值
int ArrayFisrtLast

;                          //存放最大子数组的每个元素
int ArrayNum

;                               //存放最大子数组元素的个数
cout<<"输入数的个数:";
cin>>num;
for(int i=0;i<num;i++)                             //输入元素
{
cin>>val[i];
}
for(int i=0;i<num;i++)
{
int firstNum=0,lastNum=0,q=0;                   //最大子数组开始位置(firstNum),结束的位置(lastNum)
value=0;
p=i;
for(int k=0;k<num;k++)                           //重新开辟一个新数组Array,存放以原始数组的每个元素开头的数组
{
p=p%num;
Array[k]=val[p];
p++;
}
max=0;
for(int j=0;j<num;j++)                              //找出最大子数组
{
value=value+Array[j];
if(value>max)                                      //累加和大于max,累加和赋值给max
{
max=value;
lastNum=j;
}
if(value<0)                                // 当前和小于0,重置为0
{
value=0;
firstNum=j+1;
}
}
if(max<0)                                 // 最大和依然为0,说明数组中所有元素都为负值
{
max=val[0];
firstNum=0;
lastNum=0;
for(int j=0;j<num;j++)
{
if(max<Array[j])
{
max=val[j];
firstNum=j;
lastNum=j;
}
}
}
ArrayMax[count]=max;
for(int m=firstNum;m<=lastNum;m++)
{
ArrayFisrtLast[count][q]= Array[m];
q++;
}
ArrayNum[count][0]=lastNum-firstNum+1;
count++;
}
max=ArrayMax[0];
int n=0;
for(int i=0;i<count;i++)
{
if(max<ArrayMax[i])
{
max=ArrayMax[i];
n=i;
}
}
cout<<"最大子数组是:";
for(int i=0;i<ArrayNum
[0];i++)
{
cout<<ArrayFisrtLast
[i]<<" ";
}

cout<<endl;
cout<<"最大子数组的和为:";
cout<<max<<endl;
return 0;
}


截图:





项目计划总结:

日期&&任务听课编写程序阅读相关书籍网上查找资料日总计
周一1007015195
周二404595
周三504535120
周四1004040180
周五9015105
周六401565
周日4545
周总
时间记录日志:

日期开始时间结束时间中断时间净时间活动备注
3/2114:0015:5010100听课软件工程上课
21:0021:2520阅读书籍《构建之法》《梦断代码》
3/2214:0017:0010110编程编写老师布置的作业
18:0022:0010110看书《构建之法》《梦断代码》
3/2321:0021:3030编程编写老师布置的作业
3/2314:0015:5010100听课软件工程上课
3/2416:0018:00120编程编写老师布置的作业
3/259:009:3030看书《构建之法》《梦断代码》
3/269:009:3030看书《构建之法》《梦断代码》
缺陷记录日志:

日期编号类型引入阶段排除阶段修复时间修复缺陷
3月26日1编码编码2min
重复使用最大值max,使程序出现问题
照片:

小组成员:杨涛 http://www.cnblogs.com/GloryYT/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: