一、题目要求
题目:返回一个整数数组中最大子数组的和。
要求: 要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数;
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
求所有子数组的和的最大值。要求时间复杂度为O(n);
结果溢出之后能判断。
二、设计思想
在我们的前一个程序中,由于int类型rand()随机产生数范围是0~32767,所以产生的1000个数较小,不会产生溢出。但我们通过查资料得知int32最大数是2147360000即2^31,如果结果溢出则提示溢出。
三、源代码
1 #include<iostream.h> 2 #include<stdlib.h> 3 #include<time.h> 4 void main() 5 { 6 while(1) 7 { 8 int length,temp; 9 int *arr=new int[length]; 10 cout<<"请输入该数组长度:"; 11 cin>>length; 12 //cout<<"请输入该数组:"; 13 srand((unsigned)time(NULL)); 14 for(int i=0;i<length;i++) 15 { 16 arr[i]=rand()*10000; 17 temp=rand()%2; 18 if(temp==0) 19 { 20 arr[i]=arr[i]; 21 } 22 else 23 { 24 arr[i]=-arr[i]; 25 } 26 cout<<arr[i]<<" "; 27 } 28 int result = arr[0]; 29 int sum = arr[0]; 30 for(i=1;i<length;i++) 31 { 32 if (sum > 0) 33 { 34 sum += arr[i]; 35 } 36 else 37 { 38 sum =arr[i]; 39 } 40 if (sum >result) 41 result = sum; 42 } 43 if(result<2147360000||result==2147360000) 44 { 45 cout<<"该数组中最大连续子数组之和是:"<<result<<endl; 46 } 47 else 48 { 49 cout<<"超出最大范围溢出!"<<endl; 50 } 51 cout<<"----------------------------------------"<<endl; 52 } 53 }
四、结果截图
五、实验体会
以前我们做实验的时候,总是想的太天真,理所当然的认为用户输入的一定是按我们的要求输入的,但现实情况却绝非如此,对于大数溢出问题我们考虑不周,还有其他的细节问题我们有很多没有考虑到。当输入数组的长度较大时,很可能会溢出,以后要多多注意!
六、合作照片