作业要求:
1.程序必须能处理1000个元素;
2.每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;
3.输入一个整形数组,数组里面既有正数也有负数;
4.数组中连续的一个或多个整数组成一个字数组,每个子数组都有一个和;
5.求所有子数组的和的最大值,要求时间复杂度为O(n)。
设计思想:
1.随即生成数组(含有正数和负数)。采用的是随机生成整数的方式,C语言生成的随机数为无符号数,即都是正的。要想生成正负随机的,可以先通过模除限定返回,再减去对应的范围的中间值即可。要获取-1000~+1000范围的随机数,总的数量为2001个,这样就可以通过代码rand()%2001 使得到的结果限制在0-2000范围,再减去1000, 结果就是-1000~+1000之间了。写成代码就是rand()%2001 - 1000;。
2.将数组大小定义为1000,对于每个元素定义为int32类型。
3.从第一个数开始做加法,若和大于第二个数,则继续加下一个数(若加上第三个数的和大于第三个数则重复进行此操作;小于第三个数,则舍掉前面的所有数,并继续重复进行此操作);若小于第二个数,则舍掉第一个数。
4.取数的时候对其进行了乘2的32次方即4294967296,使数组内的元素可以越界,以观察溢出情况。
出现的问题:
1.刚开始的时候不知道怎么使数据溢出。
2.在生成随机数的时候,没有生成范围在-1000到+1000的随机数。
3.对编程语言不熟练耗费了大量时间。
程序源码: #include#include #include using namespace std;int main() { int i; int a[1000]; int max = 0; int b = 0; srand(time(NULL)); cout<<"数组为:"< max) max = b; } if (max == 0) { max = a[0]; for (i = 0; i < 1000; i++) { if (max < a[i]) { max = a[i]; } } } cout <<"最大子数组为:"<< max << endl; system("pause"); return 0; }
运行结果:
总结:
这次编程刚开始的时候是处于那种一脸懵逼的情况,编程语言都忘得差不多了,复习了很长时间,就算知道计算方式但是不知道具体怎么下手。在网上找了一个有类似需求的程序,对其中的代码一段段的分析,找出符合要求的部分并且进行修改,数据溢出是很难的,我们百度之后才明白INT 32是什么意思,然后修改。