要求:
要求程序必须能处理1000个元素;
每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;
输入一个整形数组,数组里有整数也有负数;
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和;
求所有子数组的和的最大值,要求时间复杂度为O(n)。
第一段处理1000个元素:
1 #include<iostream> 2 #include<stdlib.h> 3 #include<time.h> 4 using namespace std; 5 int main() 6 { 7 int n,star=0,end=0; //n表示整型数组长度,star表示最大子数组起始位,end表示最大子数组终止位 8 cout<<"输入整型数组的长度:"; 9 cin>>n; 10 int *p=new int[n]; 11 srand((unsigned)time(NULL)); 12 for(int i=0;i<n;i++) 13 { 14 p[i]=rand()%2000-1000; //随机取-1000~1000中的整数 15 } 16 for(int i=0;i<n;i++) 17 { 18 cout<<p[i]<<" "; //输出这1000个元素 19 if((i+1)%10==0) //每十个换行 20 { 21 cout<<endl; 22 } 23 } 24 int sum=p[0]; //子数组 25 int max_sum=p[0]; //最大子数组 26 for(int i=1;i<n;i++) 27 { 28 if(sum>0) //从第二个数开始判断是否为正数 29 { 30 if(p[i]>(INT_MAX-sum)) //加入了一段判断int类型数据是否溢出。 31 { 32 cout<<"int类型溢出"<<endl; 33 return 0; 34 } 35 sum=sum+p[i]; //是正数,将和值(初始值为p【0】)和第i+1个数做和。 36 if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。 37 { 38 max_sum=sum; 39 end=i; 40 } 41 } 42 else 43 { 44 sum=p[i]; //是负数,将第i+1个数的值赋值给和值sum 45 if(sum>max_sum) //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。 46 { 47 max_sum=sum; 48 star=i; 49 end=i; 50 } 51 } 52 } 53 cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<"个"<<endl; 54 cout<<"最大子数组和为"<<max_sum<<endl; 55 return 0; 56 }
第二段溢出情况:
#include<iostream> #include<stdlib.h> #include<time.h> using namespace std; int main() { int n,star=0,end=0; //n表示整型数组长度,star表示最大子数组起始位,end表示最大子数组终止位 cout<<"输入整型数组的长度:"; cin>>n; int *p=new int[n]; srand((unsigned)time(NULL)); for(int i=0;i<n;i++) { p[i]=rand()%2000-1000; //随机取-1000~1000中的整数 p[i]=p[i]*1000000; //把随机数扩大10^6倍 } for(int i=0;i<n;i++) { cout<<p[i]<<" "; //输出这1000个元素 if((i+1)%10==0) //每十个换行 { cout<<endl; } } int sum=p[0]; //子数组 int max_sum=p[0]; //最大子数组 for(int i=1;i<n;i++) { if(sum>0) //从第二个数开始判断是否为正数 { if(p[i]>(INT_MAX-sum)) //加入了一段判断int类型数据是否溢出。 { cout<<"int类型溢出"<<endl; return 0; } sum=sum+p[i]; //是正数,将和值(初始值为p【0】)和第i+1个数做和。 if(sum>max_sum) // 并判断是否为最大,是让其赋值给max_sum,并将子数组末位置改变。 { max_sum=sum; end=i; } } else { sum=p[i]; //是负数,将第i+1个数的值赋值给和值sum if(sum>max_sum) //并判断是否为最大,是让其赋值给max_sum,并将子数组初、末位置改变。 { max_sum=sum; star=i; end=i; } } } cout<<"最大子数组位置为第"<<star+1<<"个到第"<<end+1<<"个"<<endl; cout<<"最大子数组和为"<<max_sum<<endl; return 0; }
结果只复制了结果,看到了提出int类型溢出。
总结:主要操作方法是借鉴别人的,然后两人一起在宿舍调试,最后出来结果。预计4个小时,实际上花了大概5个小时。