返回一个整型数组中最大子数组的和

 要求:
1.要求程序必须能处理1000 个元素;
2.每个元素是int32 类型的,出现子数组之和大于整型表示的最大范围会出现什么情况;
3.输入一个整形数组,数组里有正数也有负数。
4.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
5.求所有子数组的和的最大值。要求时间复杂度为O(n)。
Int类型溢出:
当两个操作数都是有符号数时,溢出就有可能发生。而且溢出的结果是未定义的。当一个运算的结果发生溢出时,任何假设都是不安全的。
例如,假定a和b是两个非负的整型变量(有符号),我们需要检查a+b是否溢出,一种想当然的方式是:
if (a + b < 0)
      溢出;
实际上,在现实世界里,这并不能正常运行。当a+b确实发生溢出时,所有关于结果如何的假设均不可靠。比如,在某些机器的cpu,加法运算将设置一个内部寄存器为四种状态:正,负,零和溢出。在这种机器上,c编译器完全有理由实现以上的例子,使得a+b返回的不是负,而是这个内存寄存器的溢出状态。显然,if的判断会失败。一种正确的方式是将a和b都强制转换为无符号整数:
if ( (unsigned)a + (unsigned)b  > INT_MAX)
      溢出;
这里的int_max值为有符号整型的最大值。在一般的编译器里是一个预定义的常量。ANSI C在limits里定义了INT_MAX,值为2的31次方-1. 不需要用到无符号算数运算的另一种可行方法是:
if (a > INT_MAX - b )      溢出;
通过此次学习,学会了int *p=new int[n];开辟动态储存空间。满足输入动态数组的要求。

rand()%1000-500产生在-500500之间的1000个数。

用if(p[i]>(INT_MAX-sum))判断int型是否溢出

判断子数组最大的步骤:

  1. 从一个正数开始
  2. 加上后一个数,和之前的和比较大小,如果变大就加上,如果变小就重新开始新的起点。

3.i的变化表示了开始和结束的标致点。

一、第一次处理1000个元素

#include<iostream>
#include<stdlib.h>
#include <time.h>
using namespace std;
int main()
{
  int n=1000,star=0,end=0;

  int *p=new int[n];
  srand((unsigned)time(NULL));
  for(int i=0;i<n;i++)
  {
      p[i]=rand()%1000-500;
  }

  for(int i=0;i<n;i++)
  {
      cout<<p[i]<<" ";
      if((i+1)%10==0)
      {
          cout<<endl;
      }
  }
  int sum=p[0];
  int max_sum=p[0];

  for(int i=1;i<n;i++)
  {
      if(sum>0)
      {
          if(p[i]>(INT_MAX-sum))
          {
              cout<<"int error"<<endl;
              return 0;
          }
          sum=sum+p[i];
         if(sum>max_sum)
           {
               max_sum=sum;
               end=i;
           }
      }
      else
      {
          sum=p[i];
             if(sum>max_sum)
             {
                max_sum=sum;
                star=i;
                end=i;
             }
      }
  }
  cout<<"from "<<star+1<<" to "<<end+1<<endl;
  cout<<"the sum of the max array:"<<max_sum<<endl;
  return 0;
}

二、第二段溢出的情况

#include<iostream>
#include<stdlib.h>
#include <time.h>
using namespace std;
int main()
{
  int n=1000,star=0,end=0;

  int *p=new int[n];
  srand((unsigned)time(NULL));
  for(int i=0;i<n;i++)
  {
      p[i]=rand()%1000-500;
      p[i]=p[i]*1000000;
  }

  for(int i=0;i<n;i++)
  {
      cout<<p[i]<<" ";
      if((i+1)%10==0)
      {
          cout<<endl;
      }
  }
  int sum=p[0];
  int max_sum=p[0];

  for(int i=1;i<n;i++)
  {
      if(sum>0)
      {
          if(p[i]>(INT_MAX-sum))
          {
              cout<<"int error"<<endl;
              return 0;
          }
          sum=sum+p[i];
         if(sum>max_sum)
           {
               max_sum=sum;
               end=i;
           }
      }
      else
      {
          sum=p[i];
             if(sum>max_sum)
             {
                max_sum=sum;
                star=i;
                end=i;
             }
      }
  }
  cout<<"from "<<star+1<<" to "<<end+1<<endl;
  cout<<"the sum of the max array:"<<max_sum<<endl;
  return 0;
}

  

 

总结:我们借鉴了网上的一些思想,然后进行了自己的吸收,预计两个小时完成,实际用时三个小时。

猜你喜欢

转载自www.cnblogs.com/try-my--best/p/9787742.html