结对人员:信1201-2班高扬、信1201-1班韩雪东
一、设计思路
对于大数溢出问题开始很迷茫,不大懂该干什么,思路匮乏。因为只要溢出这个数就不会被存储被改变,这样导致很难去判断溢出后该怎样做,但后来我们改变了一下思路,采用逆向思维,首先找到能存储的最大数,用它来减去将要运行的数,从而与即将要加的数比较,如果小了咋说明相加后会产生溢出,直接结束程序。
二、源代码
1 // ceshi.cpp : Defines the entry point for the console application. 2 //作者:韩雪东,高扬 3 //时间:2015/3/28 4 5 //#include "stdafx.h" 6 #include "stdio.h" 7 #include "stdlib.h" 8 #include "time.h" 9 10 int shuchu(int m[],int szcdx,int xhy)//m[]表示要测试的数组,szchx表示数组长度,xhy表示循环条件 11 { 12 int t,p; 13 int max,sum; 14 //缓存数组赋值 15 int c[10]; 16 int v[10]; 17 for(t=szcdx-xhy-1;t<szcdx;t++) 18 { 19 c[t-szcdx+xhy+1]=m[t]; 20 } 21 //循环 22 for(t=xhy;t>=0;t--) 23 { 24 sum=0; 25 for(p=0;p<=t;p++) 26 { 27 if(2147483647-sum<c[p]) 28 { 29 printf(" 数值过大 "); 30 system("PAUSE"); 31 32 } 33 sum=sum+c[p]; 34 } 35 v[t]=sum; 36 37 38 39 } 40 //循环输出最大值 41 max=v[0]; 42 for(t=0;t<xhy+1;t++) 43 { 44 if(max<=v[t]) 45 { 46 max=v[t]; 47 } 48 printf(" %d ",v[t]); 49 } 50 51 return max; 52 } 53 54 int main(int argc, char* argv[]) 55 { 56 srand(time(NULL)); 57 int a[10]; 58 for(int j=0;j<10;j++) 59 { 60 a[j]=rand()%100000+20000000; 61 } 62 63 int maxx[10]; 64 65 for(int i=9;i>=0;i--) 66 { 67 printf("包含数组中第%d个数在内的所有相邻子数组的和:",10-i); 68 maxx[i]=shuchu(a,10,i); 69 printf(" %d ",maxx[i]); 70 71 } 72 int maxxx=maxx[0]; 73 for(i=0;i<10;i++) 74 { 75 if(maxxx<=maxx[i]) 76 { 77 maxxx=maxx[i]; 78 79 } 80 } 81 printf(" 该数组的所有子数组的和的最大值:%d ",maxxx); 82 return 0; 83 }
三、运行结果截图
四、心得体会
以前的测试程序并没有过多的考虑过大数溢出的问题,通过这次练习认识到了大数溢出给程序带来的严重性的问题,在以后的编写程序的时候一定会注意这一个问题。
五、有图有真相