一,要求
输入一个一维整形数组,数组里有正数也有负数。
一维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值
二,设计思路
1,先随机生成一个数组,可以限制上下限的,包括正负数的。初始化当前和的值,最大和的值,还有小组起始和结束的位置,。
2,循环加和,每次循环比较当前和,与,最大和的大小,当当前和小于0 的时候舍弃当前和,重新定义起始位置为下一次循环的下标值。循环结束时记录小组起始和结束的位置,然后加和输出。
3,在每一次的循环中加入一个对数组重新排列的操作,就是把第一个位置上的数字放到最后一个位置上,然后其他数字一次放到前面一个的位置上。这样就相当于把数组变成了一个环。
三,代码
#include <iostream> #include <stdlib.h> #include <time.h> #include <math.h> using namespace std; #define ARYSIZE 4 //数组大小 #define MIN -30 #define MAX 30 void main() { int arry[ARYSIZE]; srand((unsigned)time(NULL));//产生随机种子 for(int i=0;i<ARYSIZE;i++) { arry[i]=MIN+rand()%(MAX+abs(MIN)+1); cout<<arry[i]<<" "; } cout<<endl; int max=0;//保存最大和 int curSum=0;//保存当前和 int curStart=0;//当前和的起始位置 int start=0;//最大和的起始位置 int end=0;//最大和的终止位置 int l=0,i,k; for(int i=0;i<ARYSIZE;i++) { if(arry[i]<0) l+=1; } if(l==ARYSIZE)//如果Length个数均为负数 { max=arry[0]; for(i=0;i<ARYSIZE;i++) if(arry[i]>max) { max=arry[i]; } } else { max=0; for(i=0;i<ARYSIZE;i++) { k=arry[0]; for(i=0;i<ARYSIZE-1;i++) { arry[i]=arry[i+1]; } arry[ARYSIZE-1]=k; curSum=0; for(i=0;i<ARYSIZE;i++) { if(curSum<0) { curSum=0; curStart=i; } curSum=curSum+arry[i]; if(curSum>max) { max=curSum; start=curStart; end=i; }//当前和被保存为最大值,记录下它的起始位置和结束位置 } } } cout<<"和最大的子数组为:"<<endl; if(start<=end) { for(i=start;i<=end;i++) { cout<<arry[i]<<" "; } cout<<"= "<<max; cout<<endl; } else { for(i=start;i<ARYSIZE;i++) { cout<<arry[i]<<" "; } for(i=0;i<end;i++) { cout<<arry[i]<<" "; } cout<<"= "<<max; cout<<endl; } }
四,运行截图
五,团队照