结对成员:范德一,赵永恒
一.题目:
返回一个整数数组中最大子数组的和。
二.要求:
要求程序必须能处理1000 个元素;
每个元素是int32 类型的;
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。
三.设计思路
在上一次的实验中,我们设置的数组的个数能够很好的进行扩展,所以对于第一个要求处理1000个元素比较容易实现;对于第二个要求,我们主要是想确定最大的数到底有多大,即什么时候会发生溢出的问题,当问题出现时程序怎么处理,通过查阅资料,我们最后确定了程序能够处理的最大数的取值,然后通过输出语句提示数组溢出。
四.源代码
1 #include<iostream.h> 2 3 #include<time.h> 4 5 #include<stdlib.h> 6 7 8 9 int main() 10 11 { 12 13 14 15 srand((unsigned)time(NULL)); 16 17 18 19 int a[1000]; 20 21 int m; //m是每组个数 22 23 int *sum=new int[1000]; 24 25 cout<<"*********************************"<<endl; 26 27 for(int i=0;i<1000;i++) 28 29 { 30 31 int b; 32 33 b=rand()%2; 34 35 switch (b) 36 37 { 38 39 case 0: 40 41 a[i]=rand()*350; 42 43 break; 44 45 case 1: 46 47 a[i]=-rand()*100; 48 49 break; 50 51 } 52 53 cout<<a[i]<<" "; 54 55 if((i%10)==9) 56 57 cout<<endl; //每行10个输出,换行 58 59 60 61 } 62 63 64 65 cout<<"*********************************"<<endl; 66 67 int he=0; 68 69 for(m=1;m<1001;m++) 70 71 { 72 73 int temp=0; 74 75 for(int n=0;n<m;n++) 76 77 { 78 79 temp=temp+a[n]; 80 81 } 82 83 for(int k=0;k<=(1000-m);k++) 84 85 { 86 87 sum[k]=0; 88 89 for(int j=k;j<(k+m);j++) //a[k]是每组第一个数 90 91 { 92 93 sum[k]=sum[k]+a[j]; 94 95 } 96 97 if(sum[k]>temp) 98 99 { 100 101 temp=sum[k]; 102 103 } 104 105 } 106 107 if(temp>he) 108 109 { 110 111 he=temp; 112 113 } 114 115 } 116 117 if(he>2100000000) 118 119 { 120 121 cout<<"数组溢出!"<<endl; 122 123 } 124 125 else 126 127 { 128 129 cout<<"最大子数组的和为: "<<he<<endl; 130 131 } 132 133 cout<<"*********************************"<<endl; 134 135 return 0; 136 137 }
五.运行截图
六、感想
这次实验在随机出现数的那里我们停留了很长时间,主要是不知道rand函数也是有取值范围的。在接组的开发中,我们都有一点自己的想法。最后总结在了一起,尤其是在编程的过程中,我们谁都想往上写一点,一个程序总是在加入自己的设计思路和代码的风格。我觉得一个团队还是应该把风格和规范尽量的一致,才能让团队更好的工作起来。
附: