处理溢出

一、题目及要求:

      题目:返回一个整数数组中最大子数组的和。

              要求程序必须能处理1000个元素;②每个元素都是long类型的。

二、设计思路:

      定义无符号长整型数组,长度设为1000;若所求子数组最大和的过程中出现sum〉LONG_MAX;则为溢出。输出溢出,程序无法计算结果。

三、源程序

#include<iostream.h>
#include<stdlib.h> unsigned long max1(unsigned long arry[],int length) { unsigned long sum=arry[0]; unsigned long maxsum=arry[0]; int flag =0; for(int i=1;i<length;i++) { if(sum<0) { sum=arry[i]; } else { sum=sum+arry[i]; if(sum>LONG_MAX) { cout<<"溢出,出错,无法计算"<<endl; flag=1; break; } } if(maxsum<=sum) { maxsum=sum; } } if(flag==1) { cout<<"无返回值"; return 0; } else { return maxsum; } } int main() {
srand((unsigned)time(0)); unsigned
long a[1000]; for(int i=0;i<1000;i++) { a[i]=(unsigned long)rand()%5+4294967290; cout<<a[i]<<" "; } unsigned long q=max1(a,1000); cout<<endl; cout<<q; return 0; }

四、截图

五、实验心得

  本次实验实现1000个数这个不难,可以动态申请空间,也可以定义长度1000的数组。经过和伙伴商议,最终觉得还是用1000长度这种方法。

 对于定义无符号32位长整型,只验证了正数溢出的情况,这里利用了LONG_MAX这个界限,如果大于则说明溢出,直接跳出循环。我队友说,如果都是正数,相加,如果溢出则储存的应该是负数。定义有符号长整型。相加,如果小于0;则溢出。经过验证也是可以的。

  对于负数溢出,没有做出验证。没有考虑到。是个缺漏。

  在此附上我两帅照:

  

  

原文地址:https://www.cnblogs.com/wang321/p/4378583.html