1.题目:
返回一个整数数组中最大子数组的和。
2.要求:
1)要求程序必须能处理1000个元素;
2)每个元素都是int32类型的。
3.设计思路:
处理1000个元素时让用户自己输入想要的数组长度,看看运行时出处理时间的长短,再在源程序中改善这一问题。
处理大数溢出时,由于随机函数生成的数不算太大,我们尽量让其最终存入数组的元素接近最大范围,进而求和时才可能出现大数溢出的情况。
4.源代码:
1 #include<iostream> 2 #include<stdlib.h> 3 using namespace std; 4 #include <ctime> 5 #include <cstdlib> 6 #define MAX 100000 7 int main() 8 { 9 int k,t=0,o=0; 10 int n=0,m=0; 11 int b[MAX]; 12 int a[MAX]; 13 cout<<"请输入数组中整数的个数:"<<endl; 14 cin>>k; 15 srand(time(0)); 16 for(int i=0;i<k;i++) 17 { 18 a[i]=rand()%100-50; 19 cout<<a[i]<<" "; 20 // cin>>a[i]; 21 } 22 23 for(int l=1;l<k+1;l++) 24 { 25 for(i=0;i<k-l+1;i++) 26 { 27 for(int j=i;j<i+l;j++) 28 { 29 if(j>k-1) 30 { 31 break; 32 } 33 else 34 m=m+a[j]; 35 } 36 b[n]=m; 37 m=0; 38 n=n+1; 39 } 40 } 41 int max=b[0]; 42 for(i=1;i<n;i++) 43 { 44 if(max<b[i]) 45 max=b[i]; 46 } 47 /* for(i=0;i<n;i++) 48 { 49 if(max==b[i]) 50 { 51 m=i; 52 } 53 } 54 m=m+1; 55 int r=k; 56 for(int j=0;j<k;j++) 57 { 58 if(m>=r&&r>=0) 59 { 60 m=m-r; 61 t=t+1; 62 r=r-1; 63 } 64 if(m==0&&r>0&&j!=k-1) 65 { 66 m=m+r+1; 67 break; 68 } 69 if(m==0&&r==0&&t==k) 70 { 71 m=m+1; 72 break; 73 } 74 }*/ 75 cout<<endl; 76 cout<<"该数组中的最大子数组的和为:"<<max<<endl; 77 /*cout<<"这些数字为:"; 78 m=m-1; 79 if(t==0) 80 { 81 t=1; 82 } 83 for(i=m;i<m+t;i++) 84 { 85 cout<<a[i]<<" "; 86 } 87 for(i=0;i<n;i++) 88 cout<<b[i]<<" ";*/ 89 return 0; 90 }
5.结果截图:
6.心得体会:
本次重点在于大数溢出的解决,我们首次实现大数溢出时多次出现程序异常关闭的情况,即使可以运行时也不提示错误。对于这一点的解决,我们想到了数组元素随机生成过大时则重新生成,也可以对结果进行判断,主动提示错误进而解决。但我们对于真正解决大数溢出还没有具体的解决方案,这算是我们的不足吧,日后一定多多注意这一点。