题目:返回一个整数数组中最大子数组的和。
要求:
要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
思路:
考虑到手动输入1000个元素所以在程序中由系统随机出1000个元素进行测试。代码与之前的代码差别不大。
程序代码:
1 #include <iostream.h> 2 #include<stdlib.h> 3 4 int maxSum(int* a, int n) 5 { 6 7 int sum=a[0]; 8 int b=0; 9 10 for(int i=0; i<n; i++) 11 { 12 if(b<0) //... 13 b=a[i]; 14 else 15 b+=a[i]; 16 if(sum<b) 17 sum=b; 18 } 19 return sum; 20 } 21 22 int main() 23 { 24 int n; 25 cout<<"请输入数组的元素个数: "<<endl; 26 cin>>n; 27 cout<<"请输入数组的元素: "<<endl; 28 int *a=new int[n]; 29 int x; 30 for(int i=0;i<n;i++) 31 { 32 x=rand()-rand(); 33 a[i]=x; 34 cout<<a[i]<<" "; 35 } 36 37 cout<<endl; 38 cout<<maxSum(a,n)<<endl; 39 40 return 0; 41 }
程序截图:
对代码溢出的测试:
将
int x; for(int i=0;i<n;i++) { x=rand()-rand(); a[i]=x; cout<<a[i]<<" "; }
修改为
for(int i=0;i<n;i++) { cin>>a[i]; }
程序截图:
感想:
2^31-1=2147483647, 代码的溢出范围为-2^31~2^31之间,超出即溢出。在程序的实现过程中,掌握了随机rand的使用方法,运用了调用函数,让程序变得“高大上”。但我们仍还有提升空间,让我们掌握更多的知识。