心欲呐喊

博客园 首页 新随笔 联系 订阅 管理

作业要求:

         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 <iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;

int main()
{
    int i;
    int a[1000];
    int max = 0;
    int b = 0;

    srand(time(NULL));
    cout<<"数组为:"<<endl;
    for (i = 0; i<1000; i++)
    {
        a[i] = rand()%2001-1000;
    } //获取-1000到1000范围内的随机数(数据溢出4294967296)
for (i = 0; i<1000; i++) { cout << a[i] << '\t'; } cout << endl; for (i = 0; i < 1000; i++) { b += a[i]; if (b < 0) b = 0; if (b > 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是什么意思,然后修改。

posted on 2018-10-14 16:08  心欲呐喊  阅读(132)  评论(0编辑  收藏  举报