zoukankan      html  css  js  c++  java
  • 返回一个整数数组中最大子数组的和

    作业要求:

             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] << ' '; } 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是什么意思,然后修改。

  • 相关阅读:
    [译]GLUT教程
    [译]GLUT教程
    [译]GLUT教程
    strlen,_conntof,sizeof
    《const限定符的使用》
    设备资源管理系统-JFreeChart
    设备资源管理系统-jxl报表
    设备资源管理系统-poi报表
    设备资源管理系统-分页
    设备资源管理系统-日志管理
  • 原文地址:https://www.cnblogs.com/xilei123/p/9786658.html
Copyright © 2011-2022 走看看