要求:
1.输入一个整形数组,数组里有正数也有负数。
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值。
思路:
做个项目时,我的想法是基于之前做的“能返回一个整数组中最大子数组的和”项目之上,它已经有能找出一个数组中最大子数组的功能,那么我要解决的问题就是把环形数组变成之前项目能处理的普通一维即可,就是需要在不同结点将环形数组断开,然后我想到了for循环能解决这个问题,就是把第一个数的值赋给数组中最后一个数的后面一个数,使第一个数为0,然后将第二个数放在现在数组中最后一个数的后面一个数,使第二个数为0,以此类推:
for(int z=1;z<x+1;z++)
{
Number[length++]=Number[z-1];
Number[z-1]=0;
假设我们输入了数组 :1 2 3 4 5
这段代码将生成五个数组:0 2 3 4 5 1
0 0 3 4 5 1 2
0 0 0 4 5 1 2 3
0 0 0 0 5 1 2 3 4
0 0 0 0 0 1 2 3 4 5
我也做了一段测试代码来检验能否正确生成我们需要的数组:
for(y=0;y<length;y++)
cout<<Number[y]<<endl;
将这两段代码插入到上次的项目之后,会有很多最大值结果(切断后有几种数组就有几个最大值结果),但我需要一个最大的结果,于是我想到了if语句,如果a小于当时一维数组的最大值,就让它等于那个最大值:
if(a<Compare(Number, length))
a=Compare(Number, length);
程序代码如下:
#include<iostream> #define N 1000 using namespace std; int Compare(int Group[], int Length) { int MaxSum[N][2]; MaxSum[0][0] = MaxSum[0][1] = Group[0]; for (int i = 1; i < Length; i++) { MaxSum[i][0] = __max(MaxSum[i - 1][0], MaxSum[i - 1][1]); MaxSum[i][1] = __max(MaxSum[i - 1][1] + Group[i], Group[i]); } return __max(MaxSum[Length - 1][0], MaxSum[Length - 1][1]); } int main() { int Number[N]; int length; int y,x,a; a=0; cout<<"请输入数组的长度:"<<endl; cin>>x; cout<<"请输入一个环形数组:"<<endl; cin>>Number[0]; length=1; while (getchar()!='\n') { cin>>Number[length++]; } for(int z=1;z<x+1;z++) { Number[length++]=Number[z-1]; Number[z-1]=0; /*for(y=0;y<length;y++) cout<<Number[y]<<endl;//测试能否正确的生成切断后的环形数组*/ /*printf("%d",Compare(Number, length));//返回每个切断后数组的值*/ if(a<Compare(Number, length)) a=Compare(Number, length); } cout << "该数组中的最大的子数组和为:"; cout << a << endl; system("pause"); return 0; }
运行截图如下:
测试代码运行效果如下:
设计手稿如下:
总结:因为这次设计思路比较清晰,编程整个过程遇到的阻力较小,主要是程序嵌套问题,语句放置位置不对,程序运行的结果会非常奇怪,这时就需要运用测试代码或者设中断结点运行,这样错误会很快被找到,这也是最近学到的技巧。总之能编出来这个程序还是比较开心吧。
日期 | 项目内容 | 时间(小时) |
2018.11.01 | 二柱子四则运算判断答题对错 |
2.5 |
2018.11.02 | 二柱子四则运算错题存入txt | 2 |
2018.11.04 | 返回环形数组中子数组最大值 |
2 |