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

作业要求:

         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的范围大小,产生了理解上的错误使得一开始观察数据溢出出现了问题。这次编程很好的提高了我自己。

 

 
posted @ 2018-10-14 17:38  墨染千重  阅读(389)  评论(0编辑  收藏  举报