首页 > 编程语言 > 详细

输出一个整数组中最大子数组的和

时间:2018-10-14 18:29:16      阅读:144      评论:0      收藏:0      [点我收藏+]

作业要求:

         1.程序必须能处理1000个元素;

         2.每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;

         3.输入一个整形数组,数组里面既有正数也有负数;

         4.数组中连续的一个或多个整数组成一个字数组,每个子数组都有一个和;

         5.求所有子数组的和的最大值,要求时间复杂度为O(n)。

设计思路:

       1.首先定义数组个数,然后选择是否使用随机数组

       2.随机数组则是利用srand(time(null))和rand同时作用来生成元素个数为n的随机数组并使用%限定返回使这1000个数都在10000到-10000范围内

       3.从第一个数开始做加法,若和大于第二个数,则继续加下一个数(若加上第三个数的和大于第三个数则重复进行此操作;小于第三个数,则舍掉前面的所有数,并继续重复进行此操作);若小于第二个数,则舍掉第一个数。

      4.取数的时候使用了远大于存储范围的数10个1000000000来观察(int32能表示的范围就是2的32次方,表示为数值是-2^(32-1) ~ 2^(32-1) -1)

出现的问题:

    1.一开始不太了解C++出现了好多错误

     2.发现了好多不太会的c++语句,还有很多没考虑到的情况

#include <iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
 int i,c;
 int n;
 int a[1000];
 int max = 0;
 int b = 0;
 cout << "输入数组元素个数";
 cin >> n;
 cout << "是否使用随机数组:1.是 2.不是 3.观察数据溢出";
 cin >> c;
 if (c == 1)
 {
    srand(time(NULL));
    for (i = 0; i < n; i++)
  {
      a[i] = (rand() % 20000 - 10000);
   }
 }
 if (c == 2)
 {
    for (i = 0; i < n; i++)
    {
    cin>>a[i];
   }
 }
 if (c == 3)
 {
    for (i = 0; i < 10; i++)
    {
         a[i]=1000000000;
    }
 }
 cout << "数组为:" << endl;
 for (i = 0; i<n; i++)
 {
  cout << a[i] << ‘\t‘;
 }
 cout << endl;
 for (i = 0; i < n; i++)
 {
  b += a[i];
  if (b < 0)
   b = 0;
  if (b > max)
   max = b;
 }
 if (max == 0)
 {
  max = a[0];
  for (i = 0; i < n; i++)
  {
   if (max < a[i])
   {
    max = a[i];
   }
  }
 }
 cout << "最大子数组为:" << max << endl;
 system("pause");
 return 0;
}
技术分享图片
数据溢出
技术分享图片
总结:这次编程发现了好多自身存在的问题,比如说编程语言的生疏和情况考虑的不周全,而且一开始也不是很明白int32的范围大小,产生了理解上的错误使得一开始观察数据溢出出现了问题。这次编程很好的提高了我自己。
技术分享图片

 

 

输出一个整数组中最大子数组的和

原文:https://www.cnblogs.com/nanzhujue/p/9787088.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!