一、题目要求
题目:返回一个整数数组中最大子数组的和。
要求:
要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
二、设计思路
初看到数值超出表示范围溢出的时候,首先想到的是汇编中的高位、地位,
于是便想到将数值分成高位和低四位,分别用“%”和“/”求出高地位再进行
计算和输出。
三、源代码
//作者:赵建松、张文冬
#include<iostream> #include<ctime> #define N 1000 #define M 100000 using namespace std; int main() { int count=0; srand((unsigned)time(NULL)); long int * arr=new long int[N]; long int result_h,result_l,k=0;//sum=0; long int high=0,low=0,count1=0,count2=0,c1=0,c2=0; // cout<<"随机产生"<<M<<"个数值: "<<endl; for ( long int i=0; i<N; i++ ) { //cin>>arr[i]; arr[i]=214789635 ; } result_h=arr[0]/M; result_l=arr[0]%M; if(arr[0]<0) result_l*=(-1); for (int s=0;s<N;s++) { cout<<"第"<<(s+1)<<"个元素为:"<<arr[s]<<endl; } for ( int long j=0; j<N; j++ ) { if ( high>=0 ){ c2=j; low=low+arr[j]%M; high=high+arr[j]/M+low/M; low=low%M; if(arr[j]<0) low*=(-1); count++; } else { c1=j; low=arr[j]%M; if(arr[j]<0) low*=(-1); high=arr[j]/M; count=1; } if( result_h<high||(result_h==high && (result_l>0 && result_l<low)||(result_l<0 && result_l>low))) { count1=c1; count2=c2; result_h=high; result_l=low; } } cout<<endl<<"从第"<<(count1+1)<<"到第"<<(count2+1)<<"个元素为最大子数组"<<endl<<endl; if(result_l==0){ cout<<"最大数组之和:"<<result_h<<result_l<<"0000"<<endl<<endl; } else cout<<"最大数组之和:"<<result_h<<result_l<<endl<<endl; return 0; }
四、结果截图
由于要看溢出时输出的效果,便在程序中给了数组初值,而不是随机生成的。
五、感想体会
本次结对开发时,我和赵建松是每个人都先自己想一些解决的方法,认真思考后再两个人一起讨论所有方法的可行性,这样比较容易寻求出一个对问题最优的解决方案。集两个人的方法,在最后实现的时候选择更多一些。