返回一个整型数组中最大子数组的和
要求:
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产生在-500到500之间的1000个数。
用if(p[i]>(INT_MAX-sum))判断int型是否溢出
判断子数组最大的步骤:
- 从一个正数开始
- 加上后一个数,和之前的和比较大小,如果变大就加上,如果变小就重新开始新的起点。
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; }
总结:我们借鉴了网上的一些思想,然后进行了自己的吸收,预计两个小时完成,实际用时三个小时。